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

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를 사용할 때 정확한 날짜를 얻을 수 없다는 의미입니까?



답변

기본적으로 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"


답변

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 일로 처리 될 수 있습니다.


답변