Date.parse가 왜 잘못된 결과를 줍니까?


345

사례 하나 :

new Date(Date.parse("Jul 8, 2005"));

산출:

2005 년 7 월 08 일 00:00:00 GMT-0700 (PST)

사례 2 :

new Date(Date.parse("2005-07-08"));

산출:

2005 년 7 월 7 일 목요일 17:00:00 GMT-0700 (PST)


두 번째 구문 분석이 왜 올바르지 않습니까?


30
두 번째 구문 분석 자체는 정확하지 않으며 첫 번째 구문은 현지 시간으로 구문 분석되고 두 번째 구문은 UTC로 해석됩니다. "2005 년 7 월 7 일 목요일 17:00:00 GMT-0700 (PST)"은 "2005-07-08 00:00"과 동일합니다.
jches


18

1
NaNFirefox에서 날짜가 반환 되는 이유를 알아 내기 위해 여기에 온 사람이 있다면 대부분의 다른 브라우저 (및 Node.js)는 2014 년 4 월 1 일과 같이 "2014 년 4 월"과 같이 하루가없는 날짜를 구문 분석한다는 것을 알았습니다. NaN을 반환합니다. 적절한 날짜를 전달해야합니다.
재즈

위의 Jason의 의견에 추가하려면 Firefox에서 NaN을 수신하는 경우 Firefox와 Safari에서 하이픈이 달린 날짜가 마음에 들지 않을 수도 있습니다. Chrome 만 가능합니다. 대신 슬래시를 사용하십시오.
방콕

답변:


451

5 판 사양이 나왔다까지, Date.parse방법은 완전히이었다 의존 구현 ( new Date(string)와 같습니다 Date.parse(string)(A)보다 숫자가 아니라 후자의 반환을 제외시켰다 Date). 5 판 개정판에서는 단순화 된 (약간 틀린) ISO-8601 을 지원하기 위해 요구 사항이 추가되었습니다 (또한 참조). JavaScript에서 유효한 날짜 시간 문자열이란 무엇입니까? 참조 ). 하지만 그 이외 없었다 어떤 무엇에 대한 요구 사항 Date.parse/ new Date(string)무엇이든 그들이 동의했다는 것을 이외의 동의를해야 Date#toString출력 (했다 그 어떤 말도없이).

ECMAScript 2017 (버전 8)부터 Date#toString및 의 출력을 구문 분석하려면 구현이 필요 Date#toUTCString했지만 해당 문자열의 형식은 지정되지 않았습니다.

ECMAScript 2019 (9 판)부터 Date#toString및 의 형식은 Date#toUTCString(각각)으로 지정되었습니다.

  1. ddd MMM DD YYYY HH : mm : ss ZZ [(시간대 이름)]
    예 : 2018 년 7 월 10 일 화요일 18:39:58 GMT + 0530 (IST)
  2. ddd, DD MMM YYYY HH : mm : ss Z
    예 : 화 10 Jul 2018 13:09:58 GMT

Date.parse새로운 구현에서 안정적으로 구문 분석해야하는 2 가지 형식을 추가로 제공 합니다 (지원이 어디에서나 사용되지 않으며 비준수 구현은 얼마 동안 계속 사용됨).

날짜 문자열을 수동으로 구문 분석하고 Date 생성자 가 연도, 월 및 일 인수와 함께 사용하여 모호성을 피하는 것이 좋습니다 .

// parse a date in yyyy-mm-dd format
function parseDate(input) {

  let parts = input.split('-');

  // new Date(year, month [, day [, hours[, minutes[, seconds[, ms]]]]])
  return new Date(parts[0], parts[1]-1, parts[2]); // Note: months are 0-based
}

훌륭 Date.parse합니다. 어떤 이유로 인해 영국 날짜 형식으로 동작하지 않았기 때문에 이것을 사용해야 했습니다.
Ben

1
시간 부분은 @CMS 코드로 문서화되어 있습니다. 이 코드를 "2012-01-31 12:00:00"의 날짜 형식으로 사용했습니다. return new Date(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]);완벽하게 작동합니다. 감사합니다.
Richard Rout

1
@CMS 구현에 따라 무엇 을 의미 합니까?
Royi Namir

3
@RoyiNamir, 결과는 코드를 실행하는 웹 브라우저 (또는 다른 JavaScript 구현)에 따라 결과가 달라짐을 의미합니다.
Samuel Edwin Ward

1
다른 브라우저에서 다르게 작동하는 새로운 Date (string)에 문제가 있습니다. 이전 버전의 IE에서는 문제가되지는 않지만 다른 브라우저는 일관성이 없습니다. Date.parse 또는 new Date (string)를 사용하지 마십시오.
Hoffmann

195

최근 JS 통역사를 쓴 경험을 통해 ECMA / JS 날짜의 내부 작업에 많은 어려움을 겪었습니다. 그래서 여기에 2 센트를 넣을 것이라고 생각합니다. 이 자료를 공유하면 브라우저가 날짜를 처리하는 방식의 차이점에 대한 질문에 다른 사람들이 도움이되기를 바랍니다.

입력측

모든 구현은 1970-01-01 UTC (GMT는 UTC와 동일 함) 이후 밀리 초 (ms) 수를 나타내는 64 비트 숫자로 내부적으로 날짜 값을 저장합니다. 이 날짜는 ECMAScript 시대이며 Java와 같은 다른 언어와 UNIX와 같은 POSIX 시스템에서도 사용됩니다. 신기원 이후에 발생한 날짜는 양수이고 이전 날짜는 음수입니다.

다음 코드는 모든 현재 브라우저에서 동일한 날짜로 해석되지만 현지 시간대 오프셋이 사용됩니다.

Date.parse('1/1/1970'); // 1 January, 1970

내 시간대 (EST, -05 : 00)에서 결과는 18000000입니다. 왜냐하면 5 시간 안에 몇 ms가 있기 때문입니다 (일광 절약 시간 동안 4 시간에 불과합니다). 시간대에 따라 값이 달라집니다. 이 동작은 ECMA-262에 지정되어 있으므로 모든 브라우저가 동일한 방식으로 작동합니다.

주요 브라우저가 날짜로 구문 분석하는 입력 문자열 형식에는 약간의 차이가 있지만, 구문 분석이 구현에 크게 의존하더라도 시간대와 일광 절약에 관한 한 기본적으로 동일하게 해석합니다.

그러나 ISO 8601 형식이 다릅니다. ECMAScript 2015 (ed 6)에 요약 된 두 가지 형식 중 하나이며 특히 모든 구현에서 동일한 방식으로 구문 분석해야합니다 (다른 형식은 Date.prototype.toString에 지정된 형식 ).

그러나 ISO 8601 형식 문자열의 경우에도 일부 구현에서는 잘못 구현됩니다. 다음은이 답변이 모든 구현에서 정확히 동일한 값으로 구문 분석 해야하는 ISO 8601 형식 문자열을 사용하여 내 컴퓨터에서 1/1/1970 (에포크)로 작성된 경우 Chrome과 Firefox의 비교 출력입니다 .

Date.parse('1970-01-01T00:00:00Z');       // Chrome: 0         FF: 0
Date.parse('1970-01-01T00:00:00-0500');   // Chrome: 18000000  FF: 18000000
Date.parse('1970-01-01T00:00:00');        // Chrome: 0         FF: 18000000
  • 첫 번째 경우 "Z"지정자는 입력이 UTC 시간이므로 에포크에서 오프셋되지 않고 결과가 0임을 나타냅니다.
  • 두 번째 경우 "-0500"지정자는 입력이 GMT-05 : 00에 있고 두 브라우저 모두 입력이 -05 : 00 시간대에있는 것으로 해석합니다. 즉, UTC 값은 에포크에서 오프셋되어 날짜의 내부 시간 값에 18000000ms를 추가하는 것을 의미합니다.
  • 지정자가없는 세 번째 경우 는 호스트 시스템의 로컬로 처리 해야 합니다. FF는 입력을 현지 시간으로 올바르게 처리하는 반면 Chrome은 입력을 UTC로 처리하므로 다른 시간 값을 생성합니다. 나에게 이것은 저장된 값에서 5 시간의 차이를 생성하는데 문제가 있습니다. 오프셋이 다른 다른 시스템은 다른 결과를 얻습니다.

이 차이는 2020 년부터 수정되었지만 ISO 8601 형식 문자열을 구문 분석 할 때 브라우저간에 다른 문제가 있습니다.

그러나 악화됩니다. ECMA-262의 단점은 ISO 8601 날짜 전용 형식 (YYYY-MM-DD)을 UTC로 구문 분석해야하는 반면 ISO 8601은 로컬 형식으로 구문 분석해야한다는 점입니다. 시간대 지정자가없는 길고 짧은 ISO 날짜 형식의 FF 출력 결과는 다음과 같습니다.

Date.parse('1970-01-01T00:00:00');       // 18000000
Date.parse('1970-01-01');                // 0

따라서 첫 번째는 표준 시간대가없는 ISO 8601 날짜 및 시간이므로 로컬로 구문 분석되고 두 번째는 ISO 8601 날짜 만이므로 UTC로 구문 분석됩니다.

따라서 원래 질문에 직접 대답하려면 "YYYY-MM-DD"ECMA-262에서 UTC로 해석해야하고 다른 질문은 로컬로 해석해야합니다. 그 이유는 다음과 같습니다.

이것은 동등한 결과를 생성하지 않습니다.

console.log(new Date(Date.parse("Jul 8, 2005")).toString()); // Local
console.log(new Date(Date.parse("2005-07-08")).toString());  // UTC

이것은 :

console.log(new Date(Date.parse("Jul 8, 2005")).toString());
console.log(new Date(Date.parse("2005-07-08T00:00:00")).toString());

결론은 날짜 문자열을 구문 분석하는 것입니다. 브라우저에서 안전하게 구문 분석 할 수있는 유일한 ISO 8601 문자열 은 오프셋 이있는 긴 형식 (± HH : mm 또는 "Z")입니다. 그렇게하면 현지 시간과 UTC 시간 사이를 안전하게 이동할 수 있습니다.

이것은 IE9 이후의 브라우저에서 작동합니다.

console.log(new Date(Date.parse("2005-07-08T00:00:00Z")).toString());

대부분의 최신 브라우저는 자주 사용되는 '1/1/1970'(M / D / YYYY) 및 '1/1/1970 00:00:00 AM'(M / D / YYYY hh)을 포함하여 다른 입력 형식을 동일하게 취급합니다. : mm : ss ap) 형식입니다. 다음 형식 (마지막 제외)은 모두 모든 브라우저에서 현지 시간 입력으로 처리됩니다. 이 코드의 출력은 내 시간대의 모든 브라우저에서 동일합니다. 오프셋은 타임 스탬프에 설정되어 있기 때문에 마지막 시간대는 호스트 시간대와 상관없이 -05 : 00으로 처리됩니다.

console.log(Date.parse("1/1/1970"));
console.log(Date.parse("1/1/1970 12:00:00 AM"));
console.log(Date.parse("Thu Jan 01 1970"));
console.log(Date.parse("Thu Jan 01 1970 00:00:00"));
console.log(Date.parse("Thu Jan 01 1970 00:00:00 GMT-0500"));

그러나 ECMA-262에 지정된 형식의 구문 분석도 일관되지 않으므로 내장 구문 분석기에 의존하지 말고 라이브러리를 사용하여 구문 분석기에 형식을 제공하는 등 항상 문자열을 수동으로 구문 분석하는 것이 좋습니다.

예를 들어 moment.js에서는 다음과 같이 작성할 수 있습니다.

let m = moment('1/1/1970', 'M/D/YYYY'); 

출력측

출력 측에서 모든 브라우저는 시간대를 동일한 방식으로 변환하지만 문자열 형식을 다르게 처리합니다. 다음은 toString기능과 출력 내용입니다. 통지 toUTCStringtoISOString내 컴퓨터에 기능 출력 오전 5:00. 또한 시간대 이름은 약어 일 수 있으며 구현에 따라 다를 수 있습니다.

인쇄하기 전에 UTC에서 현지 시간으로 변환

 - toString
 - toDateString
 - toTimeString
 - toLocaleString
 - toLocaleDateString
 - toLocaleTimeString

저장된 UTC 시간을 직접 인쇄합니다

 - toUTCString
 - toISOString 

Chrome에서
toString            Thu Jan 01 1970 00:00:00 GMT-05:00 (Eastern Standard Time)
toDateString        Thu Jan 01 1970
toTimeString        00:00:00 GMT-05:00 (Eastern Standard Time)
toLocaleString      1/1/1970 12:00:00 AM
toLocaleDateString  1/1/1970
toLocaleTimeString  00:00:00 AM

toUTCString         Thu, 01 Jan 1970 05:00:00 GMT
toISOString         1970-01-01T05:00:00.000Z

Firefox에서
toString            Thu Jan 01 1970 00:00:00 GMT-05:00 (Eastern Standard Time)
toDateString        Thu Jan 01 1970
toTimeString        00:00:00 GMT-0500 (Eastern Standard Time)
toLocaleString      Thursday, January 01, 1970 12:00:00 AM
toLocaleDateString  Thursday, January 01, 1970
toLocaleTimeString  12:00:00 AM

toUTCString         Thu, 01 Jan 1970 05:00:00 GMT
toISOString         1970-01-01T05:00:00.000Z

나는 일반적으로 문자열 입력에 ISO 형식을 사용하지 않습니다. 해당 형식을 사용하는 것이 유익한 유일한 날짜는 날짜를 문자열로 정렬해야 할 때입니다. ISO 형식은있는 그대로 정렬 할 수 있지만 다른 형식은 정렬 할 수 없습니다. 브라우저 간 호환성이 필요한 경우 시간대를 지정하거나 호환 가능한 문자열 형식을 사용하십시오.

코드 new Date('12/4/2013').toString()는 다음과 같은 내부 의사 변환을 거칩니다.

  "12/4/2013" -> toUCT -> [storage] -> toLocal -> print "12/4/2013"

이 답변이 도움이 되었기를 바랍니다.


3
우선, 이것은 환상적인 글쓰기입니다. 그러나 나는 의존성을 지적하고 싶었다. 시간대 지정자와 관련하여 "지정자가 없으면 현지 시간 입력을 가정해야합니다."라고 설명했습니다. 고맙게도 ECMA-262 표준으로 추정 할 필요가 없습니다. 이 상태 : Z "를 오프셋없는 시간대의 값은" "." 따라서 시간대가 지정되지 않은 날짜 / 시간 문자열은 현지 시간이 아닌 UTC로 가정됩니다. 물론 많은 것들이 JavaScript와 마찬가지로 구현 간에는 거의 일치하지 않는 것 같습니다.
Daniel

2
... 가장 많이 사용되는 '1/1/1970'및 '1/1/1970 00:00:00 AM'형식을 포함합니다. — 가장 자주 사용되는 곳은 어디 입니까? 그것은 확실히 우리 나라에 없습니다.
ulidtko

2
@ulidtko-죄송합니다. 미국에 있습니다. 와우 ... 당신은 바로 키예프에 있습니다. 나는 당신과 당신의 가족이 안전하게 지내고 곧 거기에서 안정되기를 바랍니다. 자신을 돌보고 모든 것을 다행하십시오.
drankin2112

여기에 참고하십시오. Safari 브라우저 (예 : iOS 또는 OSX)에서는 작동하지 않는 것 같습니다. 또는 다른 문제가 계속 발생합니다.
keyneom

1
@ Daniel— 다행히 ECMAScript 작성자는 날짜 및 시간 표현을위한 시간대 누락과 관련하여 오류를 수정했습니다. 시간대가없는 날짜 및 시간 문자열은 호스트 시간대 오프셋 (예 : "local")을 사용합니다. 혼란스럽게도 ISO 8601 날짜 형식은 UTC처리되지만 (사양에서 명확하지는 않지만) ISO 8601은 로컬 형식으로 취급하므로 모든 것을 고치지는 않았습니다.
RobG

70

광기에 대한 몇 가지 방법이 있습니다. 일반적으로 브라우저가 날짜를 ISO-8601로 해석 할 수 있다면 그렇게됩니다. "2005-07-08"이이 캠프에 속하므로 UTC로 구문 분석됩니다. "2005 년 7 월 8 일"은 현지 시간으로 구문 분석 할 수 없습니다.

페이지의 자바 스크립트와 날짜, 무엇 엉망! 이상.


3
" 일반적으로 브라우저가 날짜를 ISO-8601로 해석 할 수있는 경우 날짜를 해석합니다. "는 지원되지 않습니다. "2020-03-20 13:30:30"은 많은 브라우저에서 ISO 8601 및 로컬로 취급되지만 Safari의 Invalid Date는 유효하지 않습니다. 대부분의 브라우저에서 지원하지 않는 많은 ISO 8601 형식이 있습니다 (예 : 2004-W53-7 및 2020-092).
RobG

7

다른 해결책은 날짜 형식으로 연관 배열을 작성한 다음 데이터를 다시 형식화하는 것입니다.

이 방법은 날짜가 비정상적인 방식으로 유용합니다.

예를 들면 :

    mydate='01.02.12 10:20:43':
    myformat='dd/mm/yy HH:MM:ss';


    dtsplit=mydate.split(/[\/ .:]/);
    dfsplit=myformat.split(/[\/ .:]/);

    // creates assoc array for date
    df = new Array();
    for(dc=0;dc<6;dc++) {
            df[dfsplit[dc]]=dtsplit[dc];
            }

    // uses assc array for standard mysql format
    dstring[r] = '20'+df['yy']+'-'+df['mm']+'-'+df['dd'];
    dstring[r] += ' '+df['HH']+':'+df['MM']+':'+df['ss'];

5

moment.js 를 사용 하여 날짜를 구문 분석 하십시오 .

var caseOne = moment("Jul 8, 2005", "MMM D, YYYY", true).toDate();
var caseTwo = moment("2005-07-08", "YYYY-MM-DD", true).toDate();

세 번째 인수는 엄격한 구문 분석을 결정합니다 (2.3.0부터 사용 가능). 그것없이 moment.js는 또한 잘못된 결과를 줄 수 있습니다.


4

http://blog.dygraphs.com/2012/03/javascript-and-dates-what-mess.html 에 따르면 "yyyy / mm / dd"형식은 일반적인 문제를 해결합니다. "언제나 가능하면 날짜 문자열을"YYYY / MM / DD "로 고정하십시오. 보편적으로 지원되며 모호하지 않습니다.이 형식으로 모든 시간은 현지 시간입니다." 나는 일련의 테스트를했습니다 : http://jsfiddle.net/jlanus/ND2Qg/432/ 이 형식 : +는 YMD 주문 및 4 자리 연도 +를 사용하여 월과 일 주문 모호성을 피할 UTC 대 지역 문제를하지 방지 dygraphs guy 인 슬래시 + danvk를 사용하여 ISO 형식을 준수 하면이 형식이 모든 브라우저에서 적합하다고 말합니다.


저자의 답변 을보고 싶을 수도 있습니다 .
Brad Koch

jsFiddle의 예제가있는 솔루션은 datepicker 파서를 사용하므로 jQuery를 사용하면 충분히 잘 작동한다고 말할 수 있습니다. 제 경우에는 jqGrid에 문제가 있지만 parseDate 메소드가 있습니다. 그러나 어쨌든 예제는 나에게 아이디어를 +1 시켜서 도움이되었습니다. 감사합니다.
Vasil Popov

2
이력서에 관한 기사가 잘못되었으며 페이지의 첫 번째 예는 하이픈 대신 슬래시를 사용하는 것이 실제로 나쁜 조언 인 이유를 분명히 보여줍니다. 기사 작성 당시 "2012/03/13"을 사용하면 브라우저에서 UTC 대신 현지 날짜로 구문 분석했습니다. ECMAScript 사양은 "YYYY-MM-DD"(ISO8601) 사용에 대한 명시 적 지원을 정의하므로 항상 하이픈을 사용하십시오. 이 의견을 쓸 때 슬래시를 UTC로 처리하도록 Chrome이 패치되었습니다.
Lachlan Hunt

4

하지만 CMS가 올바른지 구문 분석 방법으로 문자열을 전달하는 것은 일반적으로 안전하지 않은 것으로, 새로운 ECMA-262 5 판 섹션 15.9.4.2에서 (ES5 일명) 사양은 알 수 Date.parse()실제로 ISO 형식의 날짜를 처리해야합니다. 구 사양은 그러한 주장을하지 않았다. 물론 이전 브라우저와 일부 최신 브라우저는 여전히이 ES5 기능을 제공하지 않습니다.

두 번째 예는 틀리지 않습니다. 에 의해 암시 된대로 UTC로 지정된 날짜 Date.prototype.toISOString()이지만 현지 시간대로 표시됩니다.


1
ECMAScript 2015에서 날짜 문자열의 구문 분석이 다시 변경되어 UTC가 아닌 "2005-07-08"이 로컬이되었습니다. BTW, ES5는 2011 년 6 월까지 표준이 아니 었으며 현재 ECMAScript 2015입니다. ;-)
RobG

1
TC39는 "2005-07-08" 이 UTC 여야 하지만 ""2005-07-08T00 : 00 : 00 "은 로컬이어야한다고 10 월 (이전 게시물 이후 1 개월 만에) 결정했습니다 . 둘 다 ISO 8601입니다. 호환 형식은 모두 시간대가 없지만 다르게 취급됩니다.
RobG

2

간단한 날짜 구문 분석 라이브러리 는 모든 유사한 문제를 해결해야합니다. 확장하기가 쉽기 때문에 라이브러리가 마음에 듭니다. i18n으로 할 수도 있습니다 (매우 간단하지는 않지만 그렇게 어렵지는 않습니다).

구문 분석 예 :

var caseOne = Date.parseDate("Jul 8, 2005", "M d, Y");
var caseTwo = Date.parseDate("2005-07-08", "Y-m-d");

그리고 문자열로 다시 서식을 지정하면 두 경우 모두 정확히 동일한 결과를 얻을 수 있습니다.

console.log( caseOne.dateFormat("M d, Y") );
console.log( caseTwo.dateFormat("M d, Y") );
console.log( caseOne.dateFormat("Y-m-d") );
console.log( caseTwo.dateFormat("Y-m-d") );

2

다음은 @ drankin2112에 의해 자세히 설명 된 것처럼 브라우저 간 안전한 방식으로 날짜 시간 문자열을 변환하는 짧고 유연한 스 니펫입니다.

var inputTimestamp = "2014-04-29 13:00:15"; //example

var partsTimestamp = inputTimestamp.split(/[ \/:-]/g);
if(partsTimestamp.length < 6) {
    partsTimestamp = partsTimestamp.concat(['00', '00', '00'].slice(0, 6 - partsTimestamp.length));
}
//if your string-format is something like '7/02/2014'...
//use: var tstring = partsTimestamp.slice(0, 3).reverse().join('-');
var tstring = partsTimestamp.slice(0, 3).join('-');
tstring += 'T' + partsTimestamp.slice(3).join(':') + 'Z'; //configure as needed
var timestamp = Date.parse(tstring);

브라우저는 다음과 같은 타임 스탬프 결과를 제공해야합니다 Date.parse.

(new Date(tstring)).getTime()

이미 JS 형식의 날짜를 잡기 위해 정규 표현식에 T를 추가하는 것이 좋습니다. inputTimestamp.split (/ [T \ / :-] / g)
andig

문자열을 구성 요소 부분으로 분할하면 가장 신뢰할 수있는 다음 단계는 해당 부분을 Date 생성자에 대한 인수로 사용하는 것입니다. 파서에 제공 할 다른 문자열을 만들면 1 단계로 돌아갑니다. "2014-04-29 13:00:15"는 로컬로 구문 분석해야하며 코드는 UTC 형식으로 다시 포맷해야합니다. :-(
RobG

2

둘 다 정확하지만 두 시간대가 다른 날짜로 해석되고 있습니다. 따라서 사과와 오렌지를 비교했습니다.

// local dates
new Date("Jul 8, 2005").toISOString()            // "2005-07-08T07:00:00.000Z"
new Date("2005-07-08T00:00-07:00").toISOString() // "2005-07-08T07:00:00.000Z"
// UTC dates
new Date("Jul 8, 2005 UTC").toISOString()        // "2005-07-08T00:00:00.000Z"
new Date("2005-07-08").toISOString()             // "2005-07-08T00:00:00.000Z"

Date.parse()문자열 인수에서 자동으로 사용되므로 호출을 제거했습니다 . 또한 ISO8601 형식을 사용하여 날짜를 비교하여 현지 날짜와 UTC 날짜 사이의 날짜를 시각적으로 비교할 수 있습니다. 시간은 7 시간 간격이며, 이는 시간대 차이이며 테스트에서 두 가지 다른 날짜가 표시된 이유입니다.

동일한 현지 / UTC 날짜를 만드는 다른 방법은 다음과 같습니다.

new Date(2005, 7-1, 8)           // "2005-07-08T07:00:00.000Z"
new Date(Date.UTC(2005, 7-1, 8)) // "2005-07-08T00:00:00.000Z"

그러나 나는 여전히 간단하지만 강력한 Moment.js 를 강력히 추천합니다 .

// parse string
moment("2005-07-08").format()       // "2005-07-08T00:00:00+02:00"
moment.utc("2005-07-08").format()   // "2005-07-08T00:00:00Z"
// year, month, day, etc.
moment([2005, 7-1, 8]).format()     // "2005-07-08T00:00:00+02:00"
moment.utc([2005, 7-1, 8]).format() // "2005-07-08T00:00:00Z"

0

CMS에서 허용 대답이 올바른지, 난 그냥 몇 가지 기능을 추가했습니다 :

  • 입력 공간 정리 및 청소
  • 슬래시, 대시, 콜론 및 공백 구문 분석
  • 기본 날짜와 시간이 있습니다

// parse a date time that can contains spaces, dashes, slashes, colons
function parseDate(input) {
    // trimes and remove multiple spaces and split by expected characters
    var parts = input.trim().replace(/ +(?= )/g,'').split(/[\s-\/:]/)
    // new Date(year, month [, day [, hours[, minutes[, seconds[, ms]]]]])
    return new Date(parts[0], parts[1]-1, parts[2] || 1, parts[3] || 0, parts[4] || 0, parts[5] || 0); // Note: months are 0-based
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.