[javascript] 사파리에서 유효하지 않은 날짜

 alert(new Date('2010-11-29'));

크롬, ff에는 문제가 없지만 사파리는 “잘못된 날짜”를 외칩니다. 왜 ?

편집 : 좋아, 아래 의견에 따라 문자열 구문 분석을 사용하고 이것을 시도했습니다.

alert(new Date('11-29-2010')); //doesn't work in safari
alert(new Date('29-11-2010')); //doesn't work in safari
alert(new Date('2010-29-11')); //doesn't work in safari

2018 년 3 월 22 일 편집 : 사람들이 여전히 여기에 착륙하는 것처럼 보입니다. 오늘 나는 그것을 사용 moment하거나 date-fns끝낼 것입니다. Date-fns는 통증이없고 가벼워졌습니다.



답변

패턴 yyyy-MM-ddDate생성자에 대해 공식적으로 지원되는 형식이 아닙니다 . Firefox는이를 지원하는 것 같지만 다른 브라우저에서도 마찬가지입니다.

지원되는 문자열은 다음과 같습니다.

  • MM-dd-yyyy
  • yyyy / MM / dd
  • MM / dd / yyyy
  • MMMM dd, yyyy
  • MMM dd, yyyy

DateJS 는 비표준 날짜 형식을 구문 분석하는 데 유용한 라이브러리처럼 보입니다.

편집 : 방금 ECMA-262 표준을 확인했습니다 . 섹션 15.9.1.15에서 인용 :

날짜 시간 문자열 형식

ECMAScript는 ISO 8601 확장 형식의 단순화를 기반으로 날짜-시간에 대한 문자열 교환 형식을 정의합니다. 형식은 다음과 같습니다. YYYY-MM-DDTHH : mm : ss.sssZ 여기서 필드는 다음과 같습니다.

  • YYYY는 그레고리력에서 연도의 10 진수입니다.
  • 문자열에 “-“(하이 폰)이 문자 그대로 두 번 나타납니다.
  • MM은 01 (1 월)에서 12 (12 월)까지의 달입니다.
  • DD는 01부터 31까지의 달입니다.
  • 문자열에 “T”가 나타나 시간 요소의 시작을 나타냅니다.
  • HH는 자정 이후 두 자릿수로 경과 한 완료 시간 수입니다.
  • “:”(콜론)은 문자열에서 문자 그대로 두 번 나타납니다.
  • mm은 시간 시작 이후 2 분의 10 진수로 완료된 분 수입니다.
  • ss는 분의 시작 이후 2 자리 10 진수로 표시되는 완료 시간 (초)입니다.
  • “.” (점)은 문자 그대로 문자열에 나타납니다.
  • sss는 초가 시작된 이후의 완전한 밀리 초 수입니다 (3 자리 10 진수). “.” 밀리 초 필드는 생략 될 수 있습니다.
  • Z는 “Z”(UTC의 경우) 또는 “+”또는 “-“로 지정된 시간대 오프셋이며 시간 표현은 hh : mm입니다.

이 형식에는 날짜 전용 양식이 포함됩니다.

  • YYYY
  • YYYY-MM
  • YYYY-MM-DD

선택적 시간대 오프셋이 추가 된 시간 전용 양식도 포함됩니다.

  • THH : mm
  • THH : mm : ss
  • THH : mm : ss.sss

상기의 임의의 조합 일 수있는 “날짜-시간”도 포함된다.

따라서 YYYY-MM-DD가 표준에 포함 된 것 같지만 어떤 이유로 Safari에서는이를 지원하지 않습니다.

업데이트 : datejs 문서를 보고 그것을 사용하면 다음과 같은 코드를 사용하여 문제를 해결해야합니다.

var myDate1 = Date.parseExact("29-11-2010", "dd-MM-yyyy");
var myDate2 = Date.parseExact("11-29-2010", "MM-dd-yyyy");
var myDate3 = Date.parseExact("2010-11-29", "yyyy-MM-dd");
var myDate4 = Date.parseExact("2010-29-11", "yyyy-dd-MM");


답변

Safari에서 제대로 할 수 없기 때문에 새 라이브러리를 구현하는 것은 너무 많고 정규 표현식이 과도합니다. oneliner 는 다음과 같습니다 .

console.log (new Date('2011-04-12'.replace(/-/g, "/")));


답변

나는 비슷한 문제에 직면했다. Date.Parse("DATESTRING")Chrome (버전 59.0.3071.115)에서 작동했지만 Safari (버전 10.1.1 (11603.2.5)에서는 작동하지 않음)

원정 여행:

Date.parse("2017-01-22 11:57:00")
NaN

크롬:

Date.parse("2017-01-22 11:57:00")
1485115020000

나를 위해 일한 해결책은 dateString의 공백을로 바꾸는 것입니다 "T". (예 : dateString.replace(/ /g,"T"))

원정 여행:

Date.parse("2017-01-22T11:57:00")
1485086220000

크롬:

Date.parse("2017-01-22T11:57:00")
1485115020000

Safari가 로컬 TZ (UTC보다 8 시간 늦음)로 응답을 반환했기 때문에 Safari 브라우저의 응답이 Chrome 브라우저에서 표시되는 응답보다 8 시간 (28800000ms) 적습니다.

동일한 TZ에서 두 시간을 모두 얻으려면

원정 여행:

Date.parse("2017-01-22T11:57:00Z")
1485086220000

크롬:

Date.parse("2017-01-22T11:57:00Z")
1485086220000


답변

나는 문제를 해결하기 위해 순간을 사용합니다. 예를 들어

var startDate = moment('2015-07-06 08:00', 'YYYY-MM-DD HH:mm').toDate();


답변

대부분의 브라우저에서 솔루션을 작동 시키려면이 형식으로 날짜 개체를 만들어야합니다.

(year, month, date, hours, minutes, seconds, ms)

예 :

dateObj = new Date(2014, 6, 25); //UTC time / Months are mapped from 0 to 11
alert(dateObj.getTime()); //gives back timestamp in ms

IE, FF, Chrome 및 Safari와 잘 작동합니다. 이전 버전조차도.

IE 개발자 센터 : 날짜 개체 (자바 스크립트)

Mozilla Dev Network : 날짜


답변

문자열을 Date fromat로 변환하십시오 (서버 시간대를 알아야 함)

new Date('2015-06-16 11:00:00'.replace(/\s+/g, 'T').concat('.000+08:00')).getTime()  

여기서 +08 : 00 = 서버에서 timeZone


답변

나는 같은 문제가 있었고 순간을 사용했다 .Js. 문제가 사라졌다.

문자열에서 순간을 만들 때 먼저 문자열이 알려진 ISO 8601 형식과 일치하는지 확인한 다음 알려진 형식을 찾을 수 없으면 새 날짜 (문자열)로 폴백합니다.

경고 : 문자열 구문 분석에 대한 브라우저 지원이 일치하지 않습니다. 어떤 형식을 지원해야하는지에 대한 사양이 없으므로 일부 브라우저에서 작동하는 것은 다른 브라우저에서 작동하지 않습니다.

ISO 8601 문자열 이외의 것을 구문 분석하는 일관된 결과를 얻으려면 String + Format을 사용해야합니다.

예 :

var date= moment(String);