JavaScript의 Date 유형을 사용할 때는 주의해야 합니다.

6151 단어 JavaScript

날짜 형식


정황


예를 들어 자바스크립트new Date("2013-07-08 20:38:08")를 사용하면 다음과 같이 브라우저마다 결과가 다르다.
Chrome, Opera, Vivaldi:
// 地方時
> new Date("2013-07-08 20:38:08")
< Mon Jul 08 2013 20:38:08 GMT+0900 (JST)
Firefox:
// 協定世界時
> new Date("2013-07-08 20:38:08");
< Date 2013-07-08T03:00:00.000Z
Safari:
> new Date("2013-07-08 20:38:08")
< Invalid Date = $1

까닭


이렇게 인voliad가 발생한 원인new Date() is working in Chrome but not Firefox | StackOverlow은 다음과 같다.
the EMCAScript specification requires exactly one date format (i.e., YYYY-MM-DDTHH:\mm:\ss.sssZ) but custom date formats may be freely supported by an implementation: "If the String does not conform to that [ECMAScript-defined] format the function may fall back to any implementation-specific heuristics or implementation-specific date formats."Chrome and FF simply have different "implementation-specific date formats."
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15 ECMAScript의 규격YYYY-MM-DDTHH:mm:ss.sssZ은 ISO8601 방식만 정의한 것이다.다른 형식은 브라우저에 따라 달라지므로 이전에 설명한 대로 결과가 일치하지 않습니다.

처리 방법


API에 따라 값이 2013-07-08 20:38:08인 경우 다음과 같이 수정합니다.
// MySQL から返ってくる日付の値を ISO 8601 に変換
function replaceDate(dateStr) {
  const regexp = /^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9])(?:( [0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
  return dateStr.replace(regexp, (match, year, month, day, hour, minutes, seconds) => {
    return `${year}-${month}-${ day}T${hour}:${minutes}:${seconds}.000+09:00`;
  });
}

인용하다

  • 데이트는 지뢰원 | Qita
  • JavaScript에 Date 트랩이 너무 많아요.
  • Regex to check for valid MySQL datetime formata
  • Date | MDN
  • 3/14/2012 blog from danvk Comparing FF/IE/Chrome on Parsing Date Strings
  • 좋은 웹페이지 즐겨찾기