moment.js에서 날짜를 ISO 8601로 어떻게 포맷합니까?


201

이 문서는 언급 moment.ISO_8601- (2.7.0에서 서식 옵션으로 http://momentjs.com/docs/#/parsing/special-formats/ :하지만 어느 쪽이 작업 (심지어 2.7.0)의)

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

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

moment.js에서 ISO 8601을 얻으려면 어떻게해야합니까?


어떤 순간 버전을 사용하고 있습니까? 문서는 상수가 2.7.0에 추가되었다고 말합니다.
joews

@joews 2.7.0. 문제가 명확 해졌습니다. 내가 알아 낸 대답을 참조하십시오. 문서는 명확하지 않습니다.
sennett

예, 파싱의 맥락에서 특별한 형식 만 언급합니다. 이상한.
joews

2
당신은 시도 할 수 있습니다moment().toISOString()
Saahithyan Vigneswaran 17

답변:


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

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

업데이트 대답을 기반으로 : @sennet 및 @dvlsg에 의해 주석으로는 (참조 바이올린을 )은 차이가 있음을 주목해야 format하고 toISOString. 둘 다 정확하지만 기본 프로세스가 다릅니다. toISOStringDate 객체로 변환하고 UTC로 설정 한 다음 기본 날짜 프로토 타입 함수를 사용하여 ISO8601을 UTC (밀리 초 YYYY-MM-DD[T]HH:mm:ss.SSS[Z]) 로 출력 합니다. 반면 밀리 초없이 format기본 형식 ( YYYY-MM-DDTHH:mm:ssZ)을 사용 하고 시간대 오프셋을 유지합니다.

예기치 않은 결과가 발생할 수 있다고 생각 하여 문제 를 열었습니다 .


1
@Yashua에 동의합니다. 직관적이지 않기 때문에 "format ()"의 사용을 피해야한다고 생각합니다. 또한 기본 "toISOString ()"을 래핑하는 함수가 전혀 존재하지 않아야한다고 생각합니다. 즉, 시간대를 유지하는 옵션과 함께 "toISO8601 ()"과 같은 새로운 기능을 제공하면 적절한 문서화가 더 좋습니다.
Greivin López

4
utc 시간을 원하지만 ISO8601 대신 자신 만의 방식으로 포맷 한 경우 다음을 수행 할 수 있습니다.moment().utc().format("OUTPUT_FORMAT")
StinkyCat

kibana에서 날짜 형식을 지정하는 데 유용하지만 JS에 액세스 할 수 없습니다.
Brice

1
현지 시간대를 유지하려면을 사용하십시오 moment().toISOString(true);.
Benny Neugebauer

83

format매개 변수없이 사용 :

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

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


31
참고로,이 두 답변은 모두 ISO 형식 요구 사항을 충족하더라도 동일하지 않습니다. date.toISOString()밀리 초를 유지하고 utc를 사용하고 밀리 초 date.format()를 삭제하고 현지 시간대를 사용합니다 (적어도 현재 크롬에서 표시되는 동작입니다 -jsfiddle.net/8gvhL1dz/22 )
dvlsg

아랍어 로캘과 함께 .format ()을 사용하면 영어가 아닌 아랍어 기호가 생성되므로 바람직하지 않습니다.
user393274

toISOString은 현지 시간대로 출력되지 않으며 항상 UTC (제로 오프셋)입니다.
JoeTidee 2019

11

바닐라 JS로도 가능

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

3
시간대를 유지하지 않고 UTC로 원하는 경우에만.
JoeTidee

8

Mongoose를 사용하여 MongoDB에 날짜를 저장하는 경우 모든 날짜가 밀리 초와 함께 ISO 날짜로 저장되므로 toISOString ()을 사용해야합니다.

moment.format() 

2018-04-17T20:00:00Z

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

2018-04-17T20:00:00.000Z

3

날짜 부분 (예 : 2017-06-27)을 원하고 시간대와 아랍어에 관계없이 작동하려면 다음과 같이 작성하십시오.

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
이 코드는 질문에 대한 해결책을 제공 할 수 있지만 왜 / 어떻게 작동하는지에 대한 컨텍스트를 추가하는 것이 좋습니다. 이것은 미래의 사용자가 자신의 코드를 배우고 적용 할 수 있도록 도와줍니다. 또한 코드를 설명 할 때 사용자의 의견을 공감 형태로 긍정적 인 피드백을받을 가능성이 있습니다.
borchvm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.