2012-12-16 79 views
14

Máy chủ đang gửi chuỗi theo định dạng sau: 18:00:00. Đây là giá trị thời gian trong ngày độc lập với bất kỳ ngày nào. Làm thế nào để chuyển đổi nó thành 6:00PM trong Javascript? Tôi có thể thêm vào ngày hôm nay như một chuỗi giá trị được gửi bởi máy chủ và sau đó phân tích các giá trị kết hợp và sau đó thử phương thức .toTimeString() của đối tượng Date, nhưng định dạng mà phương thức thời gian phát ra là 24 giờ với một giây. Tôi có thể viết một chức năng, nhưng có cái gì đó được xây dựng trong?Javascript: chuyển đổi chuỗi thời gian 24 giờ trong ngày thành 12 giờ với AM/PM và không có múi giờ

Trả lời

39

Không có gì được xây dựng trong, giải pháp của tôi sẽ như sau:

function tConvert (time) { 
    // Check correct time format and split into components 
    time = time.toString().match (/^([01]\d|2[0-3])(:)([0-5]\d)(:[0-5]\d)?$/) || [time]; 

    if (time.length > 1) { // If time format correct 
    time = time.slice (1); // Remove full string match value 
    time[5] = +time[0] < 12 ? 'AM' : 'PM'; // Set AM/PM 
    time[0] = +time[0] % 12 || 12; // Adjust hours 
    } 
    return time.join (''); // return adjusted time or original string 
} 

tConvert ('18:00:00'); 

Chức năng này sử dụng cụm từ thông dụng để xác nhận chuỗi thời gian và chia thành các phần thành phần của nó. Cũng lưu ý rằng các giây trong thời gian có thể được bỏ qua tùy ý. Nếu thời gian hợp lệ được trình bày, nó được điều chỉnh bằng cách thêm chỉ báo AM/PM và điều chỉnh giờ.

Giá trị trả lại là thời gian đã điều chỉnh nếu thời gian hợp lệ được hiển thị hoặc chuỗi gốc.

Xem jsFiddle: http://jsfiddle.net/ZDveb/

+0

cảm ơn câu trả lời "không có gì được xây dựng" và cho chức năng sử dụng regex. – Tim

+0

@HBP khi không có ngày chỉ có thời gian trong chuỗi cách duy nhất bạn có thể bí mật định dạng 24 giờ thành định dạng 12 giờ chỉ là mã của bạn làm việc cho tôi bó cảm ơn – skhurams

+0

Nó sẽ không hoạt động đúng giờ như "8: 30,2: 30,1: 30 "vv –

15

Để nhận được AM/PM, Kiểm tra xem phần giờ nhỏ hơn 12, sau đó là AM, khác PM.

Để nhận giờ, hãy (hour % 12) || 12.

này nên làm điều đó:

var timeString = "18:00:00"; 
var H = +timeString.substr(0, 2); 
var h = H % 12 || 12; 
var ampm = (H < 12 || H === 24) ? "AM" : "PM"; 
timeString = h + timeString.substr(2, 3) + ampm; 

http://jsfiddle.net/Skwt7/4/

Đó là giả định rằng AM lần được định dạng, ví dụ như, 08:00:00. Nếu họ được định dạng mà không có sự zero hàng đầu, bạn sẽ phải kiểm tra vị trí của ruột kết đầu tiên:

var hourEnd = timeString.indexOf(":"); 
var H = +timeString.substr(0, hourEnd); 
var h = H % 12 || 12; 
var ampm = (H < 12 || H === 24) ? "AM" : "PM"; 
timeString = h + timeString.substr(hourEnd, 3) + ampm; 

http://jsfiddle.net/Skwt7/3/

+0

nhờ hàm sử dụng chất nền. Vì giải pháp của HBP loại bỏ phần giây, tôi cho anh ta kiểm tra màu xanh lục mặc dù câu trả lời của bạn là câu trả lời đầu tiên. Bên cạnh đó, anh ấy chỉ ở mức 3K; bạn đang lăn theo điểm với 21K :-) – Tim

+0

Ah. Bằng cách nào đó tôi đã không nhận thấy rằng bạn muốn loại bỏ các giây. – gilly3

+0

nếu 12:30 PM – iamsaksham

3

nghiên cứu cùng một câu hỏi này, tôi đã đi qua một số phức tạp, khó hiểu giải pháp, và sau đó nó chợt nhận ra tôi: Có một giải pháp rất đơn giản mà không dựa vào khó các biểu thức chính quy hoặc mã phức tạp khác. Trừ khi tôi thiếu điều gì đó hiển nhiên, đây là giải pháp cực kỳ đơn giản, dễ hiểu:

function timeTo12HrFormat(time) 
{ // Take a time in 24 hour format and format it in 12 hour format 
    var time_part_array = time.split(":"); 
    var ampm = 'AM'; 

    if (time_part_array[0] >= 12) { 
     ampm = 'PM'; 
    } 

    if (time_part_array[0] > 12) { 
     time_part_array[0] = time_part_array[0] - 12; 
    } 

    formatted_time = time_part_array[0] + ':' + time_part_array[1] + ':' + time_part_array[2] + ' ' + ampm; 

    return formatted_time; 
} 



var time = timeTo12HrFormat(18:00:00); 
console.log(time); // 6:00:00 PM 
0

Giả sử bạn sẽ nhận được chuỗi ngày theo định dạng thích hợp, tôi có giải pháp.

function parseDateTime(dt) { 
     var date = false; 
     if (dt) { 
      var c_date = new Date(dt); 
      var hrs = c_date.getHours(); 
      var min = c_date.getMinutes(); 
      if (isNaN(hrs) || isNaN(min) || c_date === "Invalid Date") { 
       return null; 
      } 
      var type = (hrs <= 12) ? " AM" : " PM"; 
      date = ((+hrs % 12) || hrs) + ":" + min + type; 
     } 
     return date; 
    } 

    parseDateTime("2016-11-21 12:39:08");//"12:39 AM" 
    parseDateTime("2017-11-21 23:39:08");//"11:39 PM" 
1

Dựa trên câu trả lời của gilly3.

Nếu bạn muốn chuyển đổi:

08:00 to 08:00 AM 
16:00 to 04:00 PM 

Sau đó, điều này sẽ làm việc:

function tConv24(time24) { 
    var ts = time24; 
    var H = +ts.substr(0, 2); 
    var h = (H % 12) || 12; 
    h = (h < 10)?("0"+h):h; // leading 0 at the left for 1 digit hours 
    var ampm = H < 12 ? " AM" : " PM"; 
    ts = h + ts.substr(2, 3) + ampm; 
    return ts; 
}; 

https://jsfiddle.net/fpjs9g0L/

0

tôi thích tận dụng sức mạnh của tự nhiên javascript ngày đối tượng, thay vì làm phức tạp những thứ có biểu thức chính quy và xác thực. Ngoài ra, tôi nghĩ tốt nhất là thêm số 0 cho số giờ đơn. Tôi đã viết điều này format-12h component giải quyết vấn đề như tôi đã đề cập ở trên.

Bạn có thể xem mã và kết quả kiểm tra. Hãy nhập khẩu và sử dụng như minh họa trong các ví dụ sau:

format12h(new Date(2017,06,04,10,45,10)) => 10:45 am 
format12h(new Date(2017,06,04,23,45,10)) => 11:45 pm 
format12h(new Date(2017,06,04,23,45,10), true) => 11:45:10 pm 
Các vấn đề liên quan