簡體   English   中英

date()函數返回Safari和Firefox中的無效日期

[英]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:00ISO8601指定的幾種有效格式,但最好使用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);

這里的工作示例http://jsbin.com/ewozew/1/edit

今天我遇到了同樣的問題,不要使用破折號作為分隔符。 這在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM