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()= 12d.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.