11

我正在按以下方式格式化日期:

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

任何人都可以为此提出解决方法。如果不需要库、正则表达式或字符串操作,则加分。

4

5 回答 5

14

虽然该值2013-05-12 20:00:00ISO8601指定的几种有效格式之一,但最好使用RFC3339中定义的配置文件,它是 ISO8601 的子集。

这意味着您应该同时拥有T分隔符和时区偏移量 - 可以是数字或Z指定 UTC。换句话说,您应该使用类似2013-05-12T20:00:00-07:00或等效的值2013-05-13T03:00:00Z

现在无论您是否有正确格式的输入值,都会出现浏览器兼容性问题。所有现代浏览器都支持 ISO8601,但有些浏览器的解释不同。例如,在谷歌浏览器中,如果你省略了T它,即使Z最后有 a,它也会被解析为本地时间。在 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 这样的旧浏览器。

于 2013-05-18T03:16:41.693 回答
9

对于某些浏览器,您的日期格式不是标准的。要解析自定义日期时间格式,您可以将其拆分为单独的值并使用另一个Date接受year, month, day, hours, minutes, seconds并兼容跨浏览器的构造函数。对于您的情况,它将是这样的:

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

于 2013-05-17T20:25:28.437 回答
7

我今天遇到了同样的问题,不要使用破折号作为分隔符。这在 Chrome 中运行良好,但在 Safari/iOS 中运行良好,用斜杠替换破折号可以解决此问题。否则 Date 函数将在 Safari 中中断。

不正确的日期字符串与 -

以下代码将返回以下内容

new Date('03-25-2017');

铬合金:

Sat Mar 25 2017 00:00:00 GMT+0100 (CET)

苹果浏览器:

Invalid Date

因此,只需将-替换为/

用 / 更正日期字符串

以下代码将返回以下内容

new Date('03/25/2017');

Sat Mar 25 2017 00:00:00 GMT+0100 (CET)

野生动物园

Sat Mar 25 2017 00:00:00 GMT+0100 (CET)
于 2018-03-15T16:07:33.427 回答
2

为什么不在代码开头Date使用fix-date劫持?

import 'fix-date' // that's ok!
于 2017-07-14T06:03:42.960 回答
0

我认为您需要在日期和时间之间添加一个“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 向您吐口水一样)

于 2013-05-17T20:16:36.970 回答