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

이것은 나를 위해 일한 무엇 Firefox과 Chrome:

// 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 UTC 를 2013-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:21는 2010-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.