[英]date() function returning Invalid Date in Safari and Firefox
我按以下方式格式化日期:
date = new Date("2013-05-12 20:00:00");
formattedDate = new Date(date.getFullYear(),date.getMonth(),date.getDate());
當我在Chrome中運行它時輸出:
Sun May 12 2013 00:00:00 GMT-0700 (PDT)
這就是我需要的,但是當我在Firefox或Safari中運行時,我得到了
Invalid Date
任何人都可以為此建議解決方法。 如果它不需要庫,正則表達式或字符串操作,則為額外點。
雖然值2013-05-12 20:00:00
是ISO8601指定的幾種有效格式,但最好使用RFC3339中定義的配置文件, RFC3339是ISO8601的子集。
這意味着您應該同時具有T
分隔符和時區偏移量 - 可以是數字,也可以是Z
來指定UTC。 換句話說,您應該使用類似2013-05-12T20:00:00-07:00
或等效的2013-05-13T03:00:00Z
。
現在,無論您是否具有正確格式化的輸入值,都會出現瀏覽器兼容性問題。 所有現代瀏覽器都支持ISO8601,但有些瀏覽器的解釋方式不同。 例如,在Google Chrome中,如果省略T
,即使最后有Z
,它也會被解析為本地時間。 在Internet Explorer中,省略T
的相同值返回無效的日期錯誤。
更好的方法是使用一個抽象這些差異的庫,這樣您就可以專注於您的應用程序而不是瀏覽器的怪癖。 我知道的最好的圖書館是moment.js 。 除了完全支持ISO日期之外,您還可以使用自定義格式字符串以任何方式解析輸入。 它還有很多其他功能。 我強烈建議你去看看。
使用moment.js ,您可以執行以下操作:
// from a full date-time-offset ISO8601/RFC3339 value
var m = moment('2013-05-12T20:00:00-07:00');
// or from your custom value, with explicit formatting
// this will assume the local time zone because you didn't specify one
var m = moment('2013-05-12 20:00:00','YYYY-MM-DD HH:mm:ss');
// then you can output it in a custom format if you like
m.format("dddd, MMMM Do YYYY, h:mm:ss a"); // "Sunday, May 12th 2013, 8:00:00 pm"
據我所知, moment.js適用於所有瀏覽器 - 包括像IE6這樣的舊版本。
您的日期格式不是某些瀏覽器的標准格式。 要解析自定義日期時間格式,您可以將其拆分為單獨的值,並使用另一個接受year, month, day, hours, minutes, seconds
Date
構造函數,並且是跨瀏覽器兼容的。 對於你的情況,它將是這樣的:
var date = "2013-05-12 20:00:00",
values = date.split(/[^0-9]/),
year = parseInt(values[0], 10),
month = parseInt(values[1], 10) - 1, // Month is zero based, so subtract 1
day = parseInt(values[2], 10),
hours = parseInt(values[3], 10),
minutes = parseInt(values[4], 10),
seconds = parseInt(values[5], 10),
formattedDate;
formattedDate = new Date(year, month, day, hours, minutes, seconds);
今天我遇到了同樣的問題,不要使用破折號作為分隔符。 這在Chrome中運行良好但在Safari / iOS中無法正常工作,用斜線替換破折號可修復此問題。 否則,日期功能將在Safari中中斷。
以下代碼將返回以下內容
new Date('03-25-2017');
鉻:
Sat Mar 25 2017 00:00:00 GMT+0100 (CET)
蘋果瀏覽器:
Invalid Date
所以,只需替換-用/ 。
以下代碼將返回以下內容
new Date('03/25/2017');
Chrome :
Sat Mar 25 2017 00:00:00 GMT+0100 (CET)
Safari :
Sat Mar 25 2017 00:00:00 GMT+0100 (CET)
我認為你需要在日期和時間之間使用'T'才能讓它完全正常工作。
date = new Date("2013-05-12T20:00:00");
規范中允許有很多可能的日期時間格式,我不認為所有瀏覽器都提供所有可能性。 對於Firefox,請參閱https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/parse
要真正安全的跨瀏覽器,您可能需要嘗試使用RFC2822 / IETF日期語法(基本上與Chrome吐口水相同)
為什么不在代碼開頭劫持Date
和修復日期 ?
import 'fix-date' // that's ok!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.