사파리에서 유효하지 않은 날짜
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-dd
은 Date
생성자에 대해 공식적으로 지원되는 형식이 아닙니다 . 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
Note that the response from Safari browser is 8hrs (28800000ms) less than the response seen in Chrome browser because Safari returned the response in local TZ (which is 8hrs behind UTC)
To get both the times in same TZ
Safari:
Date.parse("2017-01-22T11:57:00Z")
1485086220000
Chrome:
Date.parse("2017-01-22T11:57:00Z")
1485086220000
I use moment to solve the problem. For example
var startDate = moment('2015-07-06 08:00', 'YYYY-MM-DD HH:mm').toDate();
To have a solution working on most browsers, you should create your date-object with this format
(year, month, date, hours, minutes, seconds, ms)
e.g.:
dateObj = new Date(2014, 6, 25); //UTC time / Months are mapped from 0 to 11
alert(dateObj.getTime()); //gives back timestamp in ms
works fine with IE, FF, Chrome and Safari. Even older versions.
IE Dev Center: Date Object (JavaScript)
convert string to Date fromat (you have to know server timezone)
new Date('2015-06-16 11:00:00'.replace(/\s+/g, 'T').concat('.000+08:00')).getTime()
where +08:00 = timeZone from server
I had the same issue.Then I used moment.Js.Problem has vanished.
When creating a moment from a string, we first check if the string matches known ISO 8601 formats, then fall back to new Date(string) if a known format is not found.
Warning: Browser support for parsing strings is inconsistent. Because there is no specification on which formats should be supported, what works in some browsers will not work in other browsers.
For consistent results parsing anything other than ISO 8601 strings, you should use String + Format.
e.g.
var date= moment(String);
Though you might hope that browsers would support ISO 8601 (or date-only subsets thereof), this is not the case. All browsers that I know of (at least in the US/English locales I use) are able to parse the horrible US MM/DD/YYYY
format.
If you already have the parts of the date, you might instead want to try using Date.UTC(). If you don't, but you must use the YYYY-MM-DD
format, I suggest using a regular expression to parse the pieces you know and then pass them to Date.UTC()
.
Use the below format, it would work on all the browsers
var year = 2016;
var month = 02; // month varies from 0-11 (Jan-Dec)
var day = 23;
month = month<10?"0"+month:month; // to ensure YYYY-MM-DD format
day = day<10?"0"+day:day;
dateObj = new Date(year+"-"+month+"-"+day);
alert(dateObj);
//Your output would look like this "Wed Mar 23 2016 00:00:00 GMT+0530 (IST)"
//Note this would be in the current timezone in this case denoted by IST, to convert to UTC timezone you can include
alert(dateObj.toUTCSting);
//Your output now would like this "Tue, 22 Mar 2016 18:30:00 GMT"
Note that now the dateObj shows the time in GMT format, also note that the date and time have been changed correspondingly.
The "toUTCSting" function retrieves the corresponding time at the Greenwich meridian. This it accomplishes by establishing the time difference between your current timezone to the Greenwich Meridian timezone.
In the above case the time before conversion was 00:00 hours and minutes on the 23rd of March in the year 2016. And after conversion from GMT+0530 (IST) hours to GMT (it basically subtracts 5.30 hours from the given timestamp in this case) the time reflects 18.30 hours on the 22nd of March in the year 2016 (exactly 5.30 hours behind the first time).
Further to convert any date object to timestamp you can use
alert(dateObj.getTime());
//output would look something similar to this "1458671400000"
This would give you the unique timestamp of the time
How about hijack Date
with fix-date? No dependencies, min + gzip = 280 B
Best way to do it is by using the following format:
new Date(year, month, day, hours, minutes, seconds, milliseconds)
var d = new Date(2018, 11, 24, 10, 33, 30, 0);
This is supported in all browsers and will not give you any issues. Please note that the months are written from 0 to 11.
The same problem facing in Safari and it was solved by inserting this in web page
<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script>
Hope it will work also your case too
Thanks
As @nizantz previously mentioned, using Date.parse() wasn't working for me in Safari. After a bit of research, I learned that the lastDateModified property for the File object has been deprecated, and is no longer supported by Safari. Using the lastModified property of the File object resolved my issues. Sure dislike it when bad info is found online.
Thanks to all who contributed to this post that assisted me in going down the path I needed to learn about my issue. Had it not been for this info, I never would have probably figured out my root issue. Maybe this will help someone else in my similar situation.
I am also facing the same problem in Safari Browser
var date = new Date("2011-02-07");
console.log(date) // IE you get ‘NaN’ returned and in Safari you get ‘Invalid Date’
Here the solution:
var d = new Date(2011, 01, 07); // yyyy, mm-1, dd
var d = new Date(2011, 01, 07, 11, 05, 00); // yyyy, mm-1, dd, hh, mm, ss
var d = new Date("02/07/2011"); // "mm/dd/yyyy"
var d = new Date("02/07/2011 11:05:00"); // "mm/dd/yyyy hh:mm:ss"
var d = new Date(1297076700000); // milliseconds
var d = new Date("Mon Feb 07 2011 11:05:00 GMT"); // ""Day Mon dd yyyy hh:mm:ss GMT/UTC
use the format 'mm/dd/yyyy'. For example :- new Date('02/28/2015'). It works well in all browsers.
참고URL : https://stackoverflow.com/questions/4310953/invalid-date-in-safari
'Programing' 카테고리의 다른 글
IOS7 : UINavigationController의 UIScrollView 오프셋 (0) | 2020.07.05 |
---|---|
PHP를 사용하여 페이지 새로 고침 (0) | 2020.07.05 |
PCH 오류를 수정하는 방법? (0) | 2020.07.05 |
BooleanToVisibilityConverter를 어떻게 반전합니까? (0) | 2020.07.05 |
클러스터형 인덱스와 비 클러스터형 인덱스의 차이점 (0) | 2020.07.05 |