Làm cách nào để định dạng ngày là ISO 8601 trong khoảnh khắc.js?


201

Tài liệu này đề cập moment.ISO_8601dưới dạng tùy chọn định dạng (từ 2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/ ), nhưng cả hai đều không hoạt động (thậm chí 2.7.0):

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

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

Làm cách nào tôi có thể nhận được ISO 8601 từ khoảnh khắc.js?


Phiên bản nào của thời điểm bạn đang sử dụng? Các tài liệu nói rằng hằng số đã được thêm vào 2.7.0.
tham gia

@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 nó. Tài liệu không quá rõ ràng mặc dù.
sennett

Vâng, họ chỉ đề cập đến các định dạng đặc biệt trong bối cảnh phân tích cú pháp. Lạ
tham gia

2
bạn có thể thửmoment().toISOString()
Saahithyan Vigneswaran

Câu trả lời:


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

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

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

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


1
Tôi đồng ý với bạn @Yashua. Tôi nghĩ nên tránh sử dụng "format ()" vì không trực quan. Ngoài ra, tôi không nghĩ rằng một hàm chỉ bao bọc "toISOString ()" nguyên gốc hoàn toàn tồn tại. Điều đó đang được nói, có lẽ cung cấp một chức năng mới như: "toISO8601 ()" với tùy chọn giữ múi giờ và một tài liệu phù hợp sẽ tốt hơn.
Greivin López

4
Nếu bạn muốn thời gian utc, nhưng được đị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

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

1
Nếu bạn muốn duy trì múi giờ địa phương, hãy sử dụng moment().toISOString(true);.
Benny Neugebauer

83

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

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

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


31
Cũng như một ghi chú bên lề, 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 đị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 tôi hiện đang nhận được trong chrome - jsfiddle.net/8gvhL1dz/22 )
dvlsg

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

toISOString không xuất ra trong múi giờ địa phương của bạn - nó luôn ở trong (không bù) UTC.
JoeTidee

11

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

new Date().toISOString() // "2017-08-26T16:31:02.349Z"

3
Chỉ khi bạn muốn nó trong UTC, mà không duy trì múi giờ.
JoeTidee

8

Khi bạn sử dụng Mongoose để lưu trữ ngày vào MongoDB, bạn cần sử dụng toISOString () vì tất cả các ngày được lưu trữ dưới dạng ISOdates với miliseconds.

moment.format() 

2018-04-17T20:00:00Z

moment.toISOString() -> USE THIS TO STORE IN MONGOOSE

2018-04-17T20:00:00.000Z

3

Nếu bạn chỉ muốn phần ngày (ví dụ: 2017-06-27) và bạn muốn nó hoạt động bất kể múi giờ và cả 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
}

0
var x = moment();

//date.format(moment.ISO_8601); // error

moment("2010-01-01T05:06:07", ["YYYY", moment.ISO_8601]);; // error
document.write(x);

2
Mặc dù mã này có thể cung cấp một giải pháp cho câu hỏi, tốt hơn là thêm ngữ cảnh vào lý do tại sao / cách thức hoạt động của nó. Điều này có thể giúp người dùng trong tương lai tìm hiểu và áp dụng kiến ​​thức đó vào mã của riêng họ. Bạn cũng có thể có phản hồi tích cực từ người dùng dưới dạng upvote, khi mã được giải thích.
borchvm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.