2014-09-08 17 views
89

tài liệu này đề cập đến moment.ISO_8601 như một tùy chọn định dạng (từ 2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/), nhưng không ai trong số những công việc (thậm chí 2.7.0):Làm cách nào để định dạng ngày tháng là ISO 8601 trong tệp moment.js?

var date = moment(); 
date.format(moment.ISO_8601); // error 
moment.format(date, moment.ISO_8601); // error 

(http://jsfiddle.net/b3d6uy05/1/)

Làm thế nào tôi có thể nhận được một ISO 8601 từ moment.js?

+0

Bạn đang sử dụng phiên bản nào? Các tài liệu nói rằng hằng số được thêm vào trong 2.7.0. – joews

+0

@joews 2.7.0. Làm rõ trong câu hỏi. Xem câu trả lời của tôi, tôi đã tìm ra. Tài liệu không rõ ràng lắm. – sennett

+0

Vâng, chúng chỉ đề cập đến các định dạng đặc biệt trong ngữ cảnh phân tích cú pháp. Odd. – joews

Trả lời

162
moment().toISOString(); // or format() - see below 

http://momentjs.com/docs/#/displaying/as-iso-string/

Cập nhật Dựa trên câu trả lời: bởi @sennet và bình luận bởi @dvlsg (xem Fiddle) cần lưu ý có sự khác biệt giữa formattoISOString. Cả hai đều đúng nhưng quy trình cơ bản khác nhau. toISOString chuyển đổi thành đối tượng Ngày tháng, đặt thành UTC, sau đó sử dụng hàm Nguyên mẫu ngày gốc để xuất ISO8601 bằng UTC với mili giây (YYYY-MM-DD[T]HH:mm:ss.SSS[Z]). Mặt khác, format sử dụng định dạng mặc định (YYYY-MM-DDTHH:mm:ssZ) không có mili giây và duy trì bù trừ múi giờ.

Tôi đã mở một issue vì tôi nghĩ rằng điều đó có thể dẫn đến kết quả không mong muốn.

+0

Tôi đồng ý với bạn @Yashua. Tôi nghĩ rằng việc sử dụng "format()" nên tránh vì không trực quan. Ngoài ra tôi không nghĩ rằng một chức năng mà chỉ cần kết thúc tốt đẹp "toISOString()" bản địa nên tồn tại ở tất cả. Điều đó đang được nói, có lẽ đưa ra một chức năng mới như: "toISO8601()" với tùy chọn giữ múi giờ và tài liệu thích hợp sẽ tốt hơn. –

+1

Nếu bạn muốn thời gian utc, nhưng định dạng theo cách riêng của bạn, thay vì ISO8601, bạn có thể làm như sau: 'moment(). Utc(). Format (" OUTPUT_FORMAT ")' – StinkyCat

+0

Hữu ích tạo thành một ngày trong kibana nhưng bạn không có quyền truy cập vào JS. – Brice

48

Sử dụng format không có tham số:

var date = moment(); 
date.format(); // "2014-09-08T08:02:17-05:00" 

(http://jsfiddle.net/8gvhL1dz/)

+20

Cũng giống như một lưu ý phụ, hai câu trả lời này không giống nhau, mặc dù cả hai đều đáp ứng các yêu cầu về định dạng ISO. 'date.toISOString()' sẽ giữ mili giây và sử dụng utc, 'date.format()' sẽ giảm mili giây và sử dụng múi giờ địa phương của bạn (hoặc ít nhất, đó là hành vi mà tôi hiện đang nhận được trong chrome - http://jsfiddle.net/8gvhL1dz/22/) – dvlsg

+0

Sử dụng .format() với ngôn ngữ Ả Rập dẫn đến ký hiệu tiếng Ả Rập thay vì tiếng Anh, có thể là không mong muốn. – user393274

2

Nếu bạn chỉ muốn phần ngày (ví dụ 2017/06/27), và bạn muốn nó làm việc không phân biệt múi giờ và cũng bằng tiếng Ả Rập, đây là mã tôi đã viết:

function isoDate(date) { 
    if (!date) { 
     return null 
    } 
    date = moment(date).toDate() 

    // don't call toISOString because it takes the time zone into 
    // account which we don't want. Also don't call .format() because it 
    // returns Arabic instead of English 

    var month = 1 + date.getMonth() 
    if (month < 10) { 
     month = '0' + month 
    } 
    var day = date.getDate() 
    if (day < 10) { 
     day = '0' + day 
    } 
    return date.getFullYear() + '-' + month + '-' + day 
} 
4

Cũng có thể với vanilla JS

new Date().toISOString() // "2017-08-26T16:31:02.349Z" 
Các vấn đề liên quan