moment.js-UTC가 잘못된 날짜를 제공합니다.


94

moment.js UTC가 항상 잘못된 날짜를 표시하는 이유는 무엇입니까? 예를 들어 크롬의 개발자 콘솔에서 :

moment(('07-18-2013')).utc().format("YYYY-MM-DD").toString()
// or
moment.utc(new Date('07-18-2013')).format("YYYY-MM-DD").toString()

둘 다 "2013-07-17" 을 반환 합니다. 전달 된 18th 대신 17th 를 반환하는 이유입니다 .

하지만 utc없이 momentjs를 사용하면 :

moment(new Date('07-18-2013')).format("YYYY-MM-DD").toString()

moment.js UTC를 사용할 때도 예상되는 "2013-07-18" 이 돌아옵니다 .

moment.js UTC를 사용할 때 정확한 날짜를 얻을 수 없다는 의미입니까?


4
난 당신이 필요하다고 생각하지 않습니다 toString()후 format()(이미 문자열을 반환).
— alex

답변:


159

기본적으로 MomentJS는 현지 시간으로 구문 분석합니다. 날짜 문자열 (시간 없음) 만 제공되는 경우 시간은 기본적으로 자정입니다.

코드에서 현지 날짜를 만든 다음 UTC 시간대로 변환합니다 (사실 순간 인스턴스가 UTC 모드 로 전환됨). 형식이 지정되면 현지 시간에 따라 앞으로 이동하거나 뒤로.

현지 시간대가 UTC + N (N은 양수)이고 날짜 전용 문자열을 구문 분석하면 이전 날짜를 가져옵니다.

다음은이를 설명하는 몇 가지 예입니다 (내 현지 시간 오프셋은 DST 동안 UTC + 3입니다).

>>> moment('07-18-2013', 'MM-DD-YYYY').utc().format("YYYY-MM-DD HH:mm")
"2013-07-17 21:00"
>>> moment('07-18-2013 12:00', 'MM-DD-YYYY HH:mm').utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 09:00"
>>> Date()
"Thu Jul 25 2013 14:28:45 GMT+0300 (Jerusalem Daylight Time)"

날짜-시간 문자열을 UTC로 해석하려면 명시해야합니다.

>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"

매트 존슨은 그의 대답에 언급 또는, 당신은 (수 아마도한다 )를 사용하여 첫 번째 장소에서 UTC 날짜로 구문 분석 moment.utc()과 모호성을 방지하기 위해 두 번째 인수로 형식 문자열을 포함한다.

>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"

다른 방법으로 UTC 날짜를 현지 날짜로 변환하려면 local()다음과 같이 메서드를 사용할 수 있습니다 .

>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm")
"2013-07-18 03:00"

감사합니다. 따라서 기본적으로 UTC를 사용할 때 항상 시간을 전달하거나 두 번째 접근 방식에서와 같이 UTC를 전달해야합니다.
— brg 2013-07-25

또는 현지 시간대를 고수하십시오. 서버에서 시간을 보내는 경우 Unix 타임 스탬프 (X) 또는 특정 시간대의 문자열로 표현할 수 있습니다. 어쨌든 사용자의 현지 시간대 대신 UTC를 사용하는 이유는 무엇입니까 (정규화 된 데이터를 서버로 보내는 목적 제외)?
— MasterAM 2013

1
알고 있어야 new Date('07-18-2013 UTC')당신이 걱정하는 경우, IE8에서는 작동하지 않습니다.
— Dzmitry Lazerka

2
나는 이것으로 너무 오랫동안 어려움을 겪어 왔습니다. 나는 이것이 moment.js의 가장 일반적인 사용 사례라고 가정하기 때문에 사이트에 잘 설명되어 있어야합니다. 정말 고맙습니다! 당신은 정말 내 피부를 구했습니다!
— WebWanderer

이 코드는 나를 위해 작동합니다 : [code] moment (strDate, 'DD / MM / YYYY h : mm A'). utc (strDate) .format ( "YYYY-MM-DD HH : mm") [/ code]
— Omar Isaid

36

Date및 둘 다 moment기본적으로 브라우저의 현지 시간대로 입력 문자열을 구문 분석합니다. 그러나 Date때로는 이와 관련하여 일관성이 없습니다. 문자열이 구체적 YYYY-MM-DD으로 하이픈을 사용 하거나 하이픈을 사용하는 경우 현지 시간YYYY-MM-DD HH:mm:ss 으로 해석 됩니다 . 와 달리 Date, moment구문 분석 방법에 대해 항상 일관성이 있습니다.

입력 순간을 제공 한 형식의 UTC로 구문 분석하는 올바른 방법은 다음과 같습니다.

moment.utc('07-18-2013', 'MM-DD-YYYY')

이 문서를 참조하십시오 .

출력을 위해 다른 형식을 지정하려면 다음을 수행하십시오.

moment.utc('07-18-2013', 'MM-DD-YYYY').format('YYYY-MM-DD')

toString명시 적으로 호출 할 필요가 없습니다 .

입력 형식을 제공하는 것은 매우 중요합니다. 01-04-2013그렇지 않으면 브라우저의 문화 설정에 따라 비슷한 날짜 가 1 월 4 일 또는 4 월 1 일로 처리 될 수 있습니다.


배우기 위해 콘솔에서 : moment.utc ( '2013-07-18 0:00 +0100', 'YYYY-MM-DD HH : mm') 은 "2013-07-18 0:00 +0100 " 하지만 jsfiddle 실행시 표시되는 dislpay는 다음과 같이 다릅니다. Thu Jul 25 2013 01:00:00 GMT + 0100 01:00:00을 참고하세요 . 감사.
— brg 2013-07-25

moment콘솔에 raw 를 출력하는 것은 그다지 유용하지 않습니다. 아마도 내부 속성 중 하나를보고있을 것입니다. 결과를 확인하기 전에 형식을 지정해야합니다. 예를 들어 moment.utc().format()또는 moment().format().
— Matt Johnson-Pint 2013

날짜와 순간은 기본적으로 브라우저의 현지 시간대로 입력 문자열을 구문 분석합니다. 나는 지금 EDT에 있습니다. FF 38.0.5에서 new Date('2010-12-12')나에게 준다 Date {Sat Dec 11 2010 19:00:00 GMT-0500 (Eastern Daylight Time)}. "현지 시간"이 의미하는 바를 맥락화하기 위해 정확히-이 경우 " Date시간대없는 문자열이 UTC로 가정하고 현지 시간으로 구문 분석 할 것 " 을 의미하는 것처럼 보입니다 . " d.getUTCDate()= 12및 d.getDate()=11
— 러핀

1
예, 몇 가지 예외가 있습니다. ES5 (최신 브라우저)는 하이픈이있는 날짜를 UTC로 해석하지만 다른 모든 것은 현지 시간으로 해석됩니다. ES6는 현지 시간과 동일한 문자열을 해석하도록이 동작을 변경합니다. 답변을 업데이트했습니다.
— Matt Johnson-Pint

하가, 그래, 단지 MDN가에서이 우연히 것을 정확하게 말하는 ( '2012-12-12'그것이 ISO 형식의 c를 / UTC의 B이지만, 'December 12, 2012'심지어 '2012/12/12'ES5의 현지 시간대로 구문 분석),하지만 당신은 나를 구타했습니다. ES6는 그들 모두를 지역적으로 만들었습니다. 날짜는 고통
— 스럽습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.