new Date ()는 Chrome에서 작동하지만 Firefox에서는 작동하지 않습니다.


93

다음과 같은 datetime 문자열을 만듭니다. 2010-07-15 11:54:21

그리고 다음 코드를 사용하면 Firefox에서 잘못된 날짜가 표시되지만 Chrome에서는 제대로 작동합니다.

var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds;
var date1 = new Date(todayDateTime);

파이어 폭스에서 date1은 나에게 유효하지 않은 날짜를 제공하지만 크롬에서는 잘 작동하지만 주요 원인은 무엇입니까?


2
만약 당신이 원하는 방식으로 플레이하고 싶다면 datejs.com
Sinan

모든 구현이 ECMA-262의 형식을 지원하는 것은 아니므로 항상 문자열을 수동으로 구문 분석합니다 (라이브러리가 도움이 될 수 있지만 단일 형식에는 필요하지 않을 수 있음).
RobG

이제 Firefox에서 작동합니다.
Sm Yamashita

답변:


80

원하는 방식으로 날짜 개체를 인스턴스화 할 수 없습니다. 특정 방식이어야합니다. 다음은 몇 가지 유효한 예입니다.

new Date() // current date and time
new Date(milliseconds) //milliseconds since 1970/01/01
new Date(dateString)
new Date(year, month, day, hours, minutes, seconds, milliseconds)

또는

d1 = new Date("October 13, 1975 11:13:00")
d2 = new Date(79,5,24)
d3 = new Date(79,5,24,11,33,0)

Chrome은 더 유연해야합니다.

출처 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

에서 apsillers의 코멘트 :

EMCAScript 사양 에는 정확히 하나의 날짜 형식 (예 : YYYY-MM-DDTHH : mm : ss.sssZ)이 필요하지만 사용자 지정 날짜 형식은 구현에서 자유롭게 지원 될 수 있습니다 . " 문자열이 [ECMAScript 정의] 형식을 따르지 않는 경우 이 함수는 구현 별 휴리스틱 또는 구현 별 날짜 형식으로 대체 될 수 있습니다. "Chrome과 FF는 단순히"구현 별 날짜 형식 "이 다릅니다.


4
Firefox를 포함한 모든 브라우저에서 작동하는 솔루션이 있습니다. stackoverflow.com/a/21984717/586051
Rahul Desai 2014

7
이 브라우저 차이가 존재하는 이유 : EMCAScript 사양 에는 정확히 하나의 날짜 형식 (예 :)이 필요YYYY-MM-DDTHH:mm:ss.sssZ 하지만 사용자 지정 날짜 형식은 구현에서 자유롭게 지원 될 수 있습니다 . " 문자열이 [ECMAScript 정의] 형식을 따르지 않는 경우 함수는 구현 별 휴리스틱 또는 구현 별 날짜 형식으로 대체합니다. "Chrome과 FF는 단순히"구현 별 날짜 형식 "이 다릅니다.
apsillers

Chrome에서는 작동하지만 Firefox에서는 작동하지 않는 날짜 형식 ( '.'이 포함 된 월)의 한 가지 예 : 'Feb. 14, 2019 '
codescribblr

이것은 '밀리 초를 더한 경우에만 파이어 폭스에서 저에게 효과적이었습니다. Date('milliseconds')그렇지 않으면 밀리 초가 정의되지 않았지만 적어도 다른 많은 시도가 실패한 곳에서 작동했다는 오류가 발생했습니다. Chrome에서는 여전히 행복해 보입니다.
Steve

24

이것은 모든 브라우저에서 작동합니다-

새 날짜 ( '2001/01/31 12:00:00 AM')

new Date('2001-01-31 12:00:00')

형식 : YYYY-MM-DDTHH : mm : ss.sss

세부 정보 : http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15


우리 모두 그것이 국제 표준이라는 것을 알고 있기 때문입니다. w3.org/International/questions/qa-date-format
바비 테이블

6
그래서 실제로 모든 브라우저를 테스트 했습니까? 그리고 당신이 가지고 있다고 가정하면 미래의 모든 브라우저가 (비표준) 형식도 지원할 것임을 알고 있습니까?
RobG

1
이것은 나를 위해 작동합니다. 따라서 이미 '2001-1-31 12:00:00'문자열을 받으면 다음과 같이 간단히 할 수 있습니다. new Date (str.replace (/-/ g, '/'));
Jianwu Chen

@JianwuChen 의도적으로 표준 형식을 비표준으로 수정하고 있습니다. 좋은 생각이 아닙니다.
JJJ

2
3 년 후 Edge 및 Window Safari에서 작동하지 않습니다.
마그네슘 타르

13

옵션 1 :

타임 스트링에 다음과 같은 형식이 있다고 가정합니다.

'2016-03-10 16:00:00.0'

이 경우 간단한 정규식을 수행하여 다음으로 변환 할 수 있습니다 ISO 8601.

'2016-03-10 16:00:00.0'.replace(/ /g,'T')

그러면 다음과 같은 출력이 생성됩니다.

'2016-03-10T16:00:00.0'

이것은 표준 datetime 형식이므로 모든 브라우저에서 지원됩니다.

document.body.innerHTML = new Date('2016-03-10T16:00:00.0') // THIS IS SAFE TO USE

옵션 2 :

타임 스트링에 다음과 같은 형식이 있다고 가정합니다.

'02-24-2015 09:22:21 PM'

여기에서 다음 정규식을 수행 할 수 있습니다.

'02-24-2015 09:22:21 PM'.replace(/-/g,'/');

이것 역시 모든 브라우저에서 지원하는 형식을 생성합니다.

document.body.innerHTML = new Date('02/24/2015 09:22:21 PM') // THIS IS SAFE TO USE

옵션 3 :

잘 지원되는 표준 중 하나로 조정하기 쉽지 않은 시간 문자열이 있다고 가정합니다.

이 경우 시간 문자열을 다른 조각으로 나누고 다음의 개별 매개 변수로 사용하는 것이 가장 좋습니다 Date.

document.body.innerHTML = new Date(2016, 2, 26, 3, 24, 0); // THIS IS SAFE TO USE


1
var d = new Date ( '2017-08-28 08:02 PM'.replace (/-/ g,'/ ')); 이것은 Mozilla에서도 크롬에서도 완벽하게 작동합니다.
Rahul Mankar

13

이것은 대부분의 브라우저에서도 작동합니다.

new Date('2001/01/31 12:00:00')

그것은 형식입니다

"yyyy/MM/dd HH:mm:ss"

3
형식이 모든 브라우저에서 작동한다는 보장은 없습니다.
RobG

당신이 맞습니다. 대답은 제 경험을 바탕으로합니다.
Alvis

8

여전히 대시를 사용하여 날짜를 작성하려면 다음 형식을 사용할 수 있습니다.

var date = new Date('2013-08-31T17:00:00Z')

그러나 UTC에 따라 시간이 생성된다는 점을 명심하십시오. 즉, GMT + 3 (GMT보다 3 시간 앞선) 시간대에 거주하는 경우이 시간대 오프셋을 시간에 추가합니다. 따라서 위의 예는 GMT + 3 인 경우이 값을 갖게됩니다 (17:00이 아니라 20:00시입니다).

Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)

마지막에 'Z'문자를 추가해야합니다. 그렇지 않으면 Chrome과 Firefox가 문자열을 다르게 구문 분석 할 것입니다 (하나는 시간 오프셋을 추가하고 다른 하나는 그렇지 않습니다).


1
예, 시간대를 제공하지 않으면 Chrome과 Firefox가 다르게 작동합니다. 그리고 흥미롭게도 나는 firefox가 잘못했다고 생각합니다. 시간대가 없으면 GMT로 가정해야합니다. 크롬은 그렇고, 파이어 폭스는 그렇지 않습니다. ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
Julian Jelfs

@ JulianJelfs— " 시간대가 없으면 GMT로 가정해야합니다. "날짜에 대해서만 (ISO 8601과 반대). 날짜 및 시간 문자열의 경우 로컬로 가정해야합니다 (ISO 8601과 일치). 그러나 어쨌든 수동 구문 분석이 유일하게 안전한 방법입니다.
RobG

5

AngularJS로 작업 할 때 Firefox와 Safari에서 비슷한 문제가 발생했습니다. 예를 들어 Angular에서 반환 된 날짜가 다음과 같은 경우 :

2014-06-02 10:28:00

이 코드 사용 :

new Date('2014-06-02 10:28:00').toISOString();

Firefox 및 Safari에서 잘못된 날짜 오류를 반환합니다. 그러나 Chrome에서는 잘 작동합니다. 또 다른 답변에서 언급했듯이 Chrome은 날짜 문자열을 구문 분석하는 데 더 유연합니다.

내 궁극적 인 목표는 특정 방식으로 날짜를 지정하는 것이 었습니다. 크로스 브라우저 호환성 문제와 날짜 형식 문제를 모두 처리하는 우수한 라이브러리를 찾았습니다. 라이브러리는 moment.js 라고 합니다 .

이 라이브러리를 사용하면 테스트 한 모든 브라우저에서 다음 코드가 올바르게 작동합니다.

moment('2014-06-02 10:28:00').format('MMM d YY')

이 추가 라이브러리를 앱에 포함시키려는 경우 가능한 브라우저 호환성 문제를 피하면서 더 쉽게 날짜 문자열을 작성할 수 있습니다. 보너스로 필요한 경우 날짜를 쉽게 형식화, 추가, 빼기 등을 할 수있는 좋은 방법이 있습니다.


문자열을 구문 분석 할 때 항상 형식을 moment.js에 전달 해야합니다 . 그렇지 않으면 유효한 날짜를 생성하는 형식을 찾을 때까지 추측합니다.
RobG

4

이것은 당신을 위해 작동합니다.

var date1 = new Date(year, month, day, hour, minute, seconds);

문자열 형식으로 날짜를 만들어야 했으므로 다음과 같이했습니다.

var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2), d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));

자바 스크립트의 월은 0에서 11까지이므로 다음과 같이 월 값을 1만큼 줄여야합니다.

var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2) - 1, d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));

2

간단한 솔루션, 이것은 모든 브라우저에서 작동합니다.

var StringDate = "24-11-2017"   
var DateVar = StringDate.split("-");
var DateVal = new Date(DateVar[1] + "/" + DateVar[0] + "/" + DateVar[2]);
alert(DateVal);

1

내가 겪은 한 가지 상황은 밀리 ​​초를 처리 할 때였습니다. FF 및 IE는 새 날짜를 만들려고 할 때이 날짜 문자열을 올바르게 구문 분석하지 않습니다. "2014/11/24 17:38:20.177Z" 그들은 처리하는 방법을 모릅니다 .177Z. 그래도 Chrome은 작동합니다.


1

이것은 나를 위해 일한 무엇 FirefoxChrome:

// The format is 'year-month-date hr:mins:seconds.milliseconds'
const d = new Date('2020-1-4 12:00:00.999') 
// we use the `.` separator between seconds and milliseconds.

행운을 빕니다...


0

실제로 Chrome은 다른 문자열 형식을 처리하는 데 더 유연합니다. 문자열 형식을 알아 내지 못하더라도 Chrome은 오류없이 문자열을 날짜로 성공적으로 변환 할 수 있습니다. 이렇게 :

  var outputDate = new Date(Date.parse(inputString));

그러나 Firefox와 Safari의 경우 상황이 더욱 복잡해집니다. 사실, Firefox 문서에는 이미 다음과 같이 나와 있습니다. ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse )

RFC2822 또는 ISO 8601 날짜를 나타내는 문자열 (다른 형식을 사용할 수 있지만 예상치 못한 결과가 발생할 수 있음).

따라서 Firefox 및 Safari에서 Date.parse 를 사용하려면 주의해야합니다. 저에게는 트릭 방법을 사용하여 처리합니다. (참고 : 모든 경우에 항상 정확하지는 않을 수 있음)

if (input.indexOf("UTC") != -1) {
  var tempInput = inputString.substr(0, 10) + "T" + inputString.substr(11, 8) + "Z";
  date = new Date(Date.parse(tempInput));
}

여기에서 먼저 2013-08-08 11:52:18 UTC2013-08-08T11 : 52 : 18Z 로 변환 한 다음 해당 형식은 Firefox 문서에 맞는 단어입니다. 현재, Date.parse는 모든 브라우저에서 항상 옳습니다.


0

모든 브라우저 (Firefox 및 Safari 포함)에서 구문 분석 할 수 있어야하는 가능한 날짜 문자열을 정의 하는 W3C 사양 이 있습니다.

Year:
   YYYY (e.g., 1997)
Year and month:
   YYYY-MM (e.g., 1997-07)
Complete date:
   YYYY-MM-DD (e.g., 1997-07-16)
Complete date plus hours and minutes:
   YYYY-MM-DDThh:mmTZD (e.g., 1997-07-16T19:20+01:00)
Complete date plus hours, minutes and seconds:
   YYYY-MM-DDThh:mm:ssTZD (e.g., 1997-07-16T19:20:30+01:00)
Complete date plus hours, minutes, seconds and a decimal fraction of a
second
   YYYY-MM-DDThh:mm:ss.sTZD (e.g., 1997-07-16T19:20:30.45+01:00)

어디

YYYY = four-digit year
MM   = two-digit month (01=January, etc.)
DD   = two-digit day of month (01 through 31)
hh   = two digits of hour (00 through 23) (am/pm NOT allowed)
mm   = two digits of minute (00 through 59)
ss   = two digits of second (00 through 59)
s    = one or more digits representing a decimal fraction of a second
TZD  = time zone designator (Z or +hh:mm or -hh:mm)

에 따르면 YYYY-MM-DDThh:mmTZD예제 2010-07-15 11:54:212010-07-15T11:54:21Z또는 2010-07-15T11:54:21+02:00(또는 다른 시간대) 로 변환해야합니다 .

다음은 각 변형의 결과를 보여주는 간단한 예입니다.

const oldDateString = '2010-07-15 11:54:21'
const newDateStringWithoutTZD = '2010-07-15T11:54:21Z'
const newDateStringWithTZD = '2010-07-15T11:54:21+02:00'
document.getElementById('oldDateString').innerHTML = (new Date(oldDateString)).toString()
document.getElementById('newDateStringWithoutTZD').innerHTML = (new Date(newDateStringWithoutTZD)).toString()
document.getElementById('newDateStringWithTZD').innerHTML = (new Date(newDateStringWithTZD)).toString()
div {
  padding: 10px;
}
<div>
  <strong>Old Date String</strong>
  <br>
  <span id="oldDateString"></span>
</div>
<div>
  <strong>New Date String (without Timezone)</strong>
  <br>
  <span id="newDateStringWithoutTZD"></span>
</div>
<div>
  <strong>New Date String (with Timezone)</strong>
  <br>
  <span id="newDateStringWithTZD"></span>
</div>


-1

Firefox에서 유효하지 않은 Date는 Date로 Date 객체로 반환 1899-11-29T19:00:00.000Z되므로 브라우저가 Firefox인지 확인한 다음 string의 Date 객체를 가져옵니다 "1899-11-29T19:00:00.000Z".getDate(). 마지막으로 날짜와 비교하십시오.


이것은 문제의 원인을 설명하는 것이 아니라 문제의 결과가 무엇인지 설명합니다.
Rytis 2014 년

-1

다음 날짜 형식을 사용했으며 모든 브라우저에서 작동합니다.

var target_date = new Date("Jul 17, 2015 16:55:22").getTime();

var days, hours, minutes, seconds;

var countdown = document.getElementById("countdown");

remaining = setInterval(function () {

    var current_date = new Date().getTime();
    var seconds_left = (target_date - current_date) / 1000;
    days = parseInt(seconds_left / 86400);
    seconds_left = seconds_left % 86400;
    hours = parseInt(seconds_left / 3600);
    seconds_left = seconds_left % 3600;
    minutes = parseInt(seconds_left / 60);
    seconds = parseInt(seconds_left % 60);
    countdown.innerHTML = "<b>"+days + " day, " + hours + " hour, "
        + minutes + " minute, " + seconds + " second.</b>";  
}, 1000);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.