JS Date()-天数的前导零
JS Date() - Leading zero on days
字符串中日期的前导零似乎会破坏Chrome中的Javascript Date对象。浏览器之间也存在一些不一致,因为Firefox正确地处理了前导零,但当不包括零时会失败。请参见此示例:https://jsfiddle.net/3m6ovh1f/3/
Date('2015-11-01'); // works in Firefox, not in Chrome
Date('2015-11-1'); // works in Chrome, not in Firefox
为什么?有没有一个好的方法可以绕过领先的零点?
请注意,字符串来自MySQL,通过AJAX,所有日期都将包含前导零,我可以通过在服务器端格式化日期来解决这个问题。什么格式最有效?
编辑
只是为了说明我的问题是什么,看起来Chrome正在对YYYY-MM-DD
格式应用时区,将11月1日的日期恢复为10月31日(因为我的EDT当地时间)。
根据ECMA-262(5.1):
函数首先尝试根据日期-时间字符串格式(15.9.1.15)中调用的规则解析字符串的格式。如果字符串不符合该格式,函数可能会返回到任何特定于实现的启发式方法或特定于实施的日期格式
15.9.1.15中描述的日期/时间字符串格式为YYYY-MM-DDTHH:mm:ss.sssZ
。它也可以是这种格式的较短表示,如YYYY-MM-DD
。
2015-11-1
是而不是Javascript的有效日期/时间字符串(注意它是YYYY-MM-D
而不是YYYY-MM-DD
)。因此,实现(浏览器)能够用该字符串执行任何它想要的操作。它可以尝试以不同的格式解析字符串,也可以简单地说字符串是无效日期。Chrome选择前者(参见DateParser::Parse
),并尝试将其解析为"遗留"日期。Firefox似乎选择了后者,并拒绝对其进行解析
现在,你声称new Date('2015-11-01')
在Chrome中不起作用是不正确的。由于字符串符合日期/时间字符串格式,Chrome必须解析它以符合规范。事实上,我只是自己尝试了一下——它在Chrome中运行。
那么,你有什么选择?
-
使用正确的日期/时间格式(即
YYYY-MM-DD
或其某些扩展)。 -
在这种情况下,使用
new Date (year, month, date)
构造函数,即new Date(2015, 10, 1)
(从0-11开始的月份)。
无论选择哪一种,都有一种日期/时间字符串格式,所有符合规范的浏览器都应该同意。
作为替代方案,为什么不使用unix时间戳呢?在JavaScript中,您可以将时间戳值乘以1000,例如
var _t = { time: 1446220558 };
var _d = new Date( _t.time*1000 );
在浏览器控制台中测试:
new Date( 14462205581000 );
// prints Fri Oct 30 2015 11:55:58 GMT-0400 (EDT)
它也有一点好处(如果数据来自JS)-你可以在每个日期元素"2015-10-30"VS 1446220558上保存2个字节:)
- 在事件上打开Materialize Date Picker
- 在经过DATE验证的列中创建null值
- 如何在javascript中获取一年中的周数,其中周日是一周中的第一天
- 如何将Date字段设置为等于另一个Date+Int值,该值表示月份值
- 将到达日历中的2天添加到离开日历中
- 为什么要做新的.Date()与new相差1小时.日期().到ISOString()
- 返回值+new Date()与Date.now()是否不同
- 为什么new Date()会删除一天?-Javascript
- 为什么js会从具有特定格式的Date对象中减去一天
- Javascript Date() 来计算年龄,而不是按天工作
- Javascript new Date将日期减少一天
- Javascript new Date(字符串)返回一天后
- javascript date()对象,在未来的8天内
- 使用JavaScript从Date获取月份名称,但使日期比实际日期提前15天
- PHP中的Date函数总是把Date往后一天
- Date对象中二月的31天
- javascript Date.parse 假设 2 月和所有月份为 31 天
- 在javascript中,从date(其中date为1)开始减少一天,导致date变为零
- Javascript Date问题返回比设置的时区少1天
- 一周的第一天- Date.js中的星期一