2011-01-28 35 views
41

Cần trợ giúp/mẹo về cách chuyển đổi ngày ISO 8601 với cấu trúc sau thành javascript.Giúp phân tích cú pháp ISO 8601 ngày trong Javascript

CCYY-MM-DDThh:mm:ssTZD 

Tôi muốn frmat ngày như vậy:

January 28, 2011 - 7:30PM EST 

Tôi muốn giữ giải pháp này càng sạch và ít càng tốt. Nếu bạn cần bất cứ điều gì khác xin vui lòng cho tôi biết! Cảm ơn!

+1

Tôi biết đây là một bài cũ, nhưng thư viện này làm những gì bạn muốn: https://github.com/csnover/js-iso8601 – Steve

Trả lời

25

datejs có thể phân tích cú pháp sau, bạn có thể muốn thử.

Date.parse('1997-07-16T19:20:15')   // ISO 8601 Formats 
Date.parse('1997-07-16T19:20:30+01:00')  // ISO 8601 with Timezone offset 

Edit: Regex phiên bản

x = "2011-01-28T19:30:00EST" 

MM = ["January", "February","March","April","May","June","July","August","September","October","November", "December"] 

xx = x.replace(
    /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):\d{2}(\w{3})/, 
    function($0,$1,$2,$3,$4,$5,$6){ 
     return MM[$2-1]+" "+$3+", "+$1+" - "+$4%12+":"+$5+(+$4>12?"PM":"AM")+" "+$6 
    } 
) 

quả

January 28, 2011 - 7:30PM EST 

Edit2: Tôi đã thay đổi múi giờ của tôi để EST và bây giờ tôi đã sau

x = "2011-01-28T19:30:00-05:00" 

MM = {Jan:"January", Feb:"February", Mar:"March", Apr:"April", May:"May", Jun:"June", Jul:"July", Aug:"August", Sep:"September", Oct:"October", Nov:"November", Dec:"December"} 

xx = String(new Date(x)).replace(
    /\w{3} (\w{3}) (\d{2}) (\d{4}) (\d{2}):(\d{2}):[^(]+\(([A-Z]{3})\)/, 
    function($0,$1,$2,$3,$4,$5,$6){ 
     return MM[$1]+" "+$2+", "+$3+" - "+$4%12+":"+$5+(+$4>12?"PM":"AM")+" "+$6 
    } 
) 

trở

January 28, 2011 - 7:30PM EST 

Về cơ bản

String(new Date(x)) 

trở

Fri Jan 28 2011 19:30:00 GMT-0500 (EST) 

phần regex chỉ chuyển đổi trên chuỗi sang định dạng yêu cầu của bạn.

January 28, 2011 - 7:30PM EST 
+0

Tôi đang làm một widget và sẽ thích nếu tôi chỉ có thể có một hàm đơn giản mà tôi có thể ném vào tệp JS của mình. Tôi nghĩ rằng datajs có thể là overkill cho điều này? Cảm ơn đề xuất và trả lời nhanh !! – Slythic

+0

@Slythic, tôi sẽ viết regex sau đó, xin giữ. – YOU

+0

@Slythic, Đã cập nhật, hãy cho tôi biết nếu có bất kỳ lỗi nào. – YOU

0

Theo MSDN, đối tượng Ngày JavaScript không cung cấp bất kỳ phương thức định dạng ngày cụ thể nào (như bạn có thể thấy bằng các ngôn ngữ lập trình khác). Tuy nhiên, bạn có thể sử dụng một vài trong số các Date phương pháp và định dạng để đạt được mục tiêu của bạn:

function dateToString (date) { 
    // Use an array to format the month numbers 
    var months = [ 
    "January", 
    "February", 
    "March", 
    ... 
    ]; 

    // Use an object to format the timezone identifiers 
    var timeZones = { 
    "360": "EST", 
    ... 
    }; 

    var month = months[date.getMonth()]; 
    var day = date.getDate(); 
    var year = date.getFullYear(); 

    var hours = date.getHours(); 
    var minutes = date.getMinutes(); 
    var time = (hours > 11 ? (hours - 11) : (hours + 1)) + ":" + minutes + (hours > 11 ? "PM" : "AM"); 
    var timezone = timeZones[date.getTimezoneOffset()]; 

    // Returns formatted date as string (e.g. January 28, 2011 - 7:30PM EST) 
    return month + " " + day + ", " + year + " - " + time + " " + timezone; 
} 

var date = new Date("2011-01-28T19:30:00-05:00"); 

alert(dateToString(date)); 

Bạn thậm chí có thể mất nó thêm một bước nữa và ghi đè lên Date.toString() phương pháp:

function dateToString() { // No date argument this time 
    // Use an array to format the month numbers 
    var months = [ 
    "January", 
    "February", 
    "March", 
    ... 
    ]; 

    // Use an object to format the timezone identifiers 
    var timeZones = { 
    "360": "EST", 
    ... 
    }; 

    var month = months[*this*.getMonth()]; 
    var day = *this*.getDate(); 
    var year = *this*.getFullYear(); 

    var hours = *this*.getHours(); 
    var minutes = *this*.getMinutes(); 
    var time = (hours > 11 ? (hours - 11) : (hours + 1)) + ":" + minutes + (hours > 11 ? "PM" : "AM"); 
    var timezone = timeZones[*this*.getTimezoneOffset()]; 

    // Returns formatted date as string (e.g. January 28, 2011 - 7:30PM EST) 
    return month + " " + day + ", " + year + " - " + time + " " + timezone; 
} 

var date = new Date("2011-01-28T19:30:00-05:00"); 
Date.prototype.toString = dateToString; 

alert(date.toString()); 
43

Các ngày xử lý đối tượng 8601 vì nó là tham số đầu tiên:

var d = new Date("2014-04-07T13:58:10.104Z"); 
console.log(d.toString()); 
+6

Không có trong tất cả các trình duyệt. Hãy nhớ rằng, đặc tả ECMA vẫn còn mơ hồ về định dạng tham số của Date(). Đó là lý do tại sao ngay cả IE11 cũng không thể xử lý những gì bạn đang đề xuất. –

+0

@ RenéStalder Tôi thực sự chỉ thử nghiệm điều này trong IE11 và nó hoạt động. Bạn đã thử nghiệm trong các phiên bản IE khác chưa? –

+2

@ RenéStalder Chỉ cần thử nghiệm trong IE9 trên Win7 quá và nó hoạt động ở đó là tốt. Trong thực tế cho đến nay tôi đã không tìm thấy một trình duyệt duy nhất không hỗ trợ nó. –

8

Nếu bạn muốn giữ cho nó đơn giản, điều này sẽ đủ:

function parseIsoDatetime(dtstr) { 
    var dt = dtstr.split(/[: T-]/).map(parseFloat); 
    return new Date(dt[0], dt[1] - 1, dt[2], dt[3] || 0, dt[4] || 0, dt[5] || 0, 0); 
} 

lưu ý parseTính năng là phải, parseTôi không phải lúc nào cũng hoạt động. Bản đồ yêu cầu IE9 trở lên.

trình cho các định dạng:

  • 2014-12-28 15:30:30
  • 2014-12-28T15: 30: 30
  • 2014-12-28

Không hợp lệ cho múi giờ, xem các câu trả lời khác về các múi giờ đó.

+1

+1 đơn giản và di động. Tôi đã thực hiện thay đổi này để diễn giải ngày tháng là UTC: 'trả về ngày mới (Date.UTC (dt [0], dt [1] - 1, dt [2], dt [3] || 0, dt [4] || 0, dt [5] || 0, 0)); ' –

1

Có thể, bạn có thể sử dụng moment.js theo ý kiến ​​của tôi là thư viện JavaScript tốt nhất để phân tích cú pháp, định dạng và làm việc với các ngày phía máy khách. Bạn có thể sử dụng một cái gì đó như:

var momentDate = moment('1890-09-30T23:59:59+01:16:20', 'YYYY-MM-DDTHH:mm:ss+-HH:mm:ss'); 
 
var jsDate = momentDate.toDate(); 
 

 
// Now, you can run any JavaScript Date method 
 

 
jsDate.toLocaleString();

Ưu điểm của việc sử dụng một thư viện như moment.js là mã của bạn sẽ hoạt động hoàn hảo ngay cả trong trình duyệt cũ như IE 8+.

Đây là documenation về các phương pháp phân tích cú pháp: https://momentjs.com/docs/#/parsing/

Các vấn đề liên quan