programing tip

새 날짜 ( "2017-01-01")와 새 날짜 ( "2017-1-1")의 차이점은 무엇입니까?

itbloger 2020. 10. 22. 07:46
반응형

새 날짜 ( "2017-01-01")와 새 날짜 ( "2017-1-1")의 차이점은 무엇입니까?


이 질문에 이미 답변이 있습니다.

I 입력 new Date("2017-01-01")크롬 콘솔은, 출력은 시간이 8 보여 주지만, new Date("2017-01-1")그리고 new Date("2017-1-01")어떻게하지, 쇼, 그 시간은 모두 0이다 new Date(dateString)구문 분석을?

new Date("2017-01-01")
// Sun Jan 01 2017 08:00:00 GMT+0800 (中国标准时间)*
new Date("2017-01-1")
// Sun Jan 01 2017 00:00:00 GMT+0800 (中国标准时间)*
new Date("2017-1-1")
// Sun Jan 01 2017 00:00:00 GMT+0800 (中国标准时间)*
new Date("2017-1-01")
// Sun Jan 01 2017 00:00:00 GMT+0800 (中国标准时间)*

'2017-01-01'은 ISO 표준 ES5 날짜 시간 문자열 형식 (ISO 8601 확장 형식의 단순화)을 따르 므로 UTC 시간 (중국에서는 오전 8시)입니다. 다른 모든 문자열은 Chrome 1 에서 현지 시간으로 파싱됩니다 .


1 Chromium의 관련 소스 코드 : https://cs.chromium.org/chromium/src/v8/src/dateparser-inl.h?type=cs&l=16

Chromium의 날짜 파싱은 표준 ES5 규칙과 다음 추가 규칙을 따릅니다.

  • 첫 번째 숫자 앞의 인식 할 수없는 단어는 무시됩니다.
  • 괄호 안의 텍스트는 무시됩니다.
  • 뒤에 오는 부호없는 숫자 :는 시간 값이며 TimeComposer. 뒤에 오는 숫자 ::는 두 번째 0도 추가합니다. 뒤에 오는 숫자 .도 시간이며 뒤에 밀리 초가 와야합니다. 다른 숫자는 날짜 구성 요소이며에 추가됩니다 DayComposer.
  • 월 이름 (또는 실제로 : 월 이름과 처음 세 글자가 동일한 모든 단어)은 Day작곡가 에서 이름이 지정된 월로 기록됩니다 .
  • 시간대로 인식 할 수있는 단어는 그대로 기록됩니다 (+|-)(hhmm|hh:).
  • 레거시 날짜는 추가 기호 ( +또는 -)를 허용하지 않거나 )숫자를 읽은 후 일치하지 않습니다 (첫 번째 숫자 이전에는 쓰레기가 허용됨).
  • ES5 규칙과 위의 규칙을 충족하는 모든 문자열은 ES5 규칙을 사용하여 구문 분석됩니다. 이것은 "1970-01-01"현지 시간대가 아닌 UTC 시간대에 있음을 의미 합니다.

그게 무슨 뜻입니까?

먼저 "2017-01-01"은 "날짜-시간"문자열 대신 "날짜"문자열이고 "날짜"문자열의 ES5 정의와 일치하므로 UTC 시간으로 구문 분석됩니다. 시간이 첨부되면 ISO 표준을 따르고 현지 시간으로 구문 분석합니다.

예 :

  • 2017-01-01 -2017 년 1 월 1 일 UTC 시간
  • 2017-01-01T00:00 -현지 시간으로 2017 년 1 월 1 일
  • 2017-1-1 -현지 시간으로 2017 년 1 월 1 일
  • 2017-(hello)01-01 -현지 시간으로 2017 년 1 월 1 일
  • may 2017-01-01 -현지 시간으로 2017 년 5 월 1 일
  • mayoooo 2017-01-01 -현지 시간으로 2017 년 5 월 1 일
  • "jan2017feb-mar01apr-may01jun" -2017 년 6 월 1 일 현지 시간

새 날짜 ( "2017-01-01")와 새 날짜 ( "2017-1-1")의 차이

new Date("2017-01-01")사양에 맞습니다 (아래 참조). new Date("2017-1-1")그렇지 않으므로 JavaScript 엔진이 적용하려는 "... 구현 별 휴리스틱 또는 구현 별 날짜 형식" 으로 대체됩니다. 예를 들어, 성공적으로 구문 분석하는 방법 (또는 여부)을 보장하지 않으며, 그렇다면 UTC 또는 현지 시간으로 구문 분석 할 것인지 여부를 보장 할 수 없습니다.

하지만이 new Date("2017-01-01")에-사양, 슬프게도의 브라우저는 그것을 움직이는 표적이었다와 그것에 시간대 표시가 없기 때문에, 어떻게해야하는 무엇 :

  • ES5 (2009 년 12 월)에서 시간대 표시기가없는 문자열은 UTC로 구문 분석되어야했습니다. 그러나 날짜 / 시간 형식이 기반으로하는 ISO-8601 표준과는 다릅니다. 즉, 시간대 표시기가없는 문자열은 UTC가 아니라 현지 시간을 의미합니다. 따라서 ES5에서는 new Date("2017-01-01")UTC로 구문 분석됩니다.
  • ES2015 (일명 ES6, 2015 년 6 월)에서 시간대 표시기가없는 문자열은 ISO-8601과 같이 UTC가 아닌 현지 시간으로 간주되었습니다. 따라서 ES2015에서는 new Date("2017-01-01")현지 시간으로 구문 분석됩니다.
  • 그러나 브라우저가 수년 동안 UTC로 날짜 전용 양식을 구문 분석했기 때문에 ES2016 (2016 년 6 월) 에서 다시 변경 되었습니다 -. 따라서 ES2016부터 날짜 전용 양식 (예 :) "2017-01-01"은 UTC로 구문 분석되지만 날짜 / 시간 양식 (예 :) "2017-01-01T00:00:00"은 현지 시간으로 구문 분석됩니다.

안타깝게도 모든 JavaScript 엔진이 현재 사양을 구현하는 것은 아닙니다. Chrome (이 글을 쓰는 시점에서 v56)은 날짜 / 시간 형식이 현지 시간이어야하지만 (IE9도 마찬가지 임) UTC로 날짜 / 시간 형식을 구문 분석합니다. 그러나 Chrome, Firefox 및 IE11 (IE10 또는 Edge는 편리하지 않음)은 모두 날짜 전용 양식을 UTC로 올바르게 처리합니다. IE8은 ISO-8601 형식을 전혀 구현하지 않습니다 (ES5 사양이 출시되기 전에 출시되었습니다).


날짜를 구문 분석 할 때 JavaScript는 ISO 날짜를 UTC 시간으로, 기타 형식을 현지 시간으로 해석합니다.

MDN 기사가 , 제안

문자열이 ISO 8601 날짜 전용 인 경우 UTC 시간대는 인수를 해석하는 데 사용됩니다.

날짜 문자열이 '2014 년 3 월 7 일'이면 parse ()는 현지 시간대를 가정 하지만 '2014-03-07'과 같은 ISO 형식이 주어지면 시간대는 UTC (ES5 및 ECMAScript 2015)로 간주됩니다 . 따라서 이러한 문자열을 사용하여 생성 된 Date 객체는 시스템이 UTC의 현지 시간대로 설정되지 않는 한 지원되는 ECMAScript의 버전에 따라 다른 시간을 나타낼 수 있습니다. 즉, 동일하게 표시되는 두 개의 날짜 문자열이 변환되는 문자열의 형식에 따라 두 개의 다른 값이 될 수 있음을 의미합니다.

// 2017-03-28 is interpreted as UTC time,
// shown as 2017-03-28 00:00:00 in UTC timezone,
// shown as 2017-03-28 06:00:00 in my timezone:
console.log("ISO dates:");
var isoDates = [new Date("2017-03-28")];
for (var dt of isoDates)
{
  console.log(dt.toUTCString() + " / " + dt.toLocaleString());
}

// Other formats are interpreted as local time, 
// shown as 2017-03-27 18:00:00 in my timezone,
// shown 2017-03-28 00:00:00 in my timezone:
console.log("Other formats:");
var otherDates = [new Date("2017-3-28"), new Date("March 28, 2017"), new Date("2017/03/28")];
for (var dt of otherDates)
{
  console.log(dt.toUTCString() + " / " + dt.toLocaleString());
}


This format is International Standard (ISO format)

new Date("2017-01-01")

This guarantees same output across all browsers.

However, the other formats may change according to browser as they are not so well defined.

As you can see that this format

new Date("2017-1-1")

is parsed successfully in chrome, but gives error in IE 11

참고URL : https://stackoverflow.com/questions/43060107/what-is-the-difference-between-new-date2017-01-01-and-new-date2017-1-1

반응형