我按以下方式格式化日期:
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
任何人都可以为此建议解决方法。如果它不需要库,正则表达式或字符串操作,则为额外点。
答案 0 :(得分:12)
虽然值2013-05-12 20:00:00
是ISO8601指定的几种有效格式,但最好使用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等旧版浏览器。
答案 1 :(得分:8)
您的日期格式不适用于某些浏览器。要解析自定义日期时间格式,您可以将其拆分为单独的值,并使用另一个接受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);
答案 2 :(得分:2)
今天我遇到了同样的问题,不要使用破折号作为分隔符。这在Chrome中运行良好但在Safari / iOS中无法正常工作,用斜线替换破折号可修复此问题。否则,日期功能将在Safari中中断。
以下代码将返回以下内容
new Date('03-25-2017');
<强>铬:强>
Sat Mar 25 2017 00:00:00 GMT+0100 (CET)
<强> Safari浏览器:强>
Invalid Date
因此,只需将 - 替换为 / 。
以下代码将返回以下内容
new Date('03/25/2017');
<强>铬强>:
Sat Mar 25 2017 00:00:00 GMT+0100 (CET)
<强> Safari浏览器强>:
Sat Mar 25 2017 00:00:00 GMT+0100 (CET)
答案 3 :(得分:0)
我认为你需要一个&#39; T&#39;在日期和时间之间使其完全运作。
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吐口水相同)
答案 4 :(得分:0)
为什么不在代码的开头用fix-date劫持Date
?
import 'fix-date' // that's ok!