新的Date()适用于Chrome,但不适用于Firefox

时间:2010-07-15 16:01:38

标签: javascript google-chrome date datetime firefox

我正在创建一个如下所示的日期时间字符串:2010-07-15 11:54:21

使用以下代码我在Firefox中获得无效日期,但在Chrome中工作得很好

var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds;
var date1 = new Date(todayDateTime);

在firefox中,date1给了我一个无效的日期,但是在chrome中它的工作正常,主要原因是什么?

14 个答案:

答案 0 :(得分:75)

您无法以任何方式实例化日期对象。它必须以特定的方式。以下是一些有效的例子:

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规范requires exactly one date format(即YYYY-MM-DDTHH:mm:ss.sssZ)但是custom date formats may be freely supported by an implementation:“如果字符串不符合[ECMAScript-defined]格式函数可以回退到任何特定于实现的启发式或特定于实现的日期格式。“Chrome和FF只是具有不同的”特定于实现的日期格式。“

答案 1 :(得分:21)

这适用于所有浏览器 -

  

新日期('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

答案 2 :(得分:10)

这也适用于大多数浏览器

new Date('2001/01/31 12:00:00')

这是

的格式
"yyyy/MM/dd HH:mm:ss"

答案 3 :(得分:10)

选项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'

这是标准的日期时间格式,因此受到所有浏览器的支持:



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




答案 4 :(得分:8)

如果您仍想使用短划线创建日期,则可以使用以下格式:

var date = new Date('2013-08-31T17:00:00Z')

但请记住,它会根据UTC创造时间。这意味着,如果您居住在GMT + 3(比GMT提前3小时)时区,它会将此时区偏移量添加到时间。因此,上面的示例将具有此值,如果GMT + 3(请注意它是小时20:00而不是17:00):

Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)

请务必在最后添加“Z”字母,否则Chrome和Firefox会以不同的方式解析字符串(一个会添加时间偏移,另一个则不会)。

答案 5 :(得分: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')

如果您愿意将此额外库添加到您的应用中,您可以更轻松地构建日期字符串,同时避免可能的浏览器兼容性问题。作为奖励,如果需要,您可以轻松地格式化,添加,减去等日期。

答案 6 :(得分: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));

请记住,javascript中的月份是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));

答案 7 :(得分:1)

我遇到的一种情况是处理毫秒。尝试创建新日期时,FF和IE不会正确解析此日期字符串。 "2014/11/24 17:38:20.177Z" 他们不知道如何处理.177Z。 Chrome可以使用。

答案 8 :(得分:1)

简单解决方案,适用于所有浏览器,

var StringDate = "24-11-2017"   
var DateVar = StringDate.split("-");
var DateVal = new Date(DateVar[1] + "/" + DateVar[0] + "/" + DateVar[2]);
alert(DateVal);

答案 9 :(得分:1)

这是在FirefoxChrome上对我有用的东西:

// 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.

祝你好运...

答案 10 :(得分:0)

事实上,Chrome可以更灵活地处理不同的字符串格式。即使你没有弄清楚它的String格式,Chrome仍然可以成功地将String转换为Date而不会出错。像这样:

  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将始终在任何浏览器中。

答案 11 :(得分:0)

有一个W3C specification定义了可能由任何浏览器(包括Firefox和Safari)解析的日期字符串:

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:21Z2010-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>

答案 12 :(得分:-1)

在Firefox中,任何无效的Date都作为Date 1899-11-29T19:00:00.000Z作为Date对象返回,因此请检查浏览器是否为Firefox,然后获取字符串"1899-11-29T19:00:00.000Z".getDate()的Date对象。最后将其与日期进行比较。

答案 13 :(得分:-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);