在日期字段中设置日期会导致日期被设置为前一天。

8
我正在使用日期输入类型在HTML表单中显示/获取日期:
<input type="date">

要从JavaScript设置日期,我这样做:

myInput.valueAsDate = new Date();

这很好用。但是如果我想设置另一个日期对象,例如:
myInput.valueAsDate = new Date(1995, 0, 1);

它显示的是12/31/1994——恰好是1995年除夕的前一天。如果我将小时参数添加24,则日期将正确显示,但日期对象本身显然是1995年1月2日,这不是解决此问题的好方法。

console.log(myInput.valueAsDate = new Date(1995, 0, 1));
console.log(myInput.valueAsDate);
<input type="date" id="myInput">

我在控制台中得到了这个:
Sun Jan 01 1995 00:00:00 GMT+0200 (EET)
Sat Dec 31 1994 02:00:00 GMT+0200 (EET)

这是浏览器问题吗?有没有解决方法/解决方案?

最后,我不想使用任何插件来显示/获取日期,但我想使用原生日期input元素(至少,这个问题是关于它的:-))。

我在Chromium和Chrome中复制了这个问题。 Firefox似乎还不支持日期类型输入


在Chrome上看起来对我有效。我看到01/01/1995。 - Drew Dahlman
版本号 45.0.2454.101。 - Drew Dahlman
@DrewDahlman 哦,看起来已经修复了。我正在使用45.0.2454.85版本。那就发一个答案吧!:-) 如果你在Chromium中找到了这个问题,我会更加感激。 :) - Ionică Bizău
1
哦,好观点。Toby发布了一个有趣的答案。 - Ionică Bizău
1
关于时区的事情,这实际上非常有趣。知道了还是挺好的! - Drew Dahlman
显示剩余7条评论
1个回答

8

时区差异请参考这里

显然,在使用new Date()时,您使用的是当前时区,而valueAsDate采用的是GMT dateTime

将您的代码更改为以下内容:

console.log(myInput.valueAsDate = new Date(1995, 0, 1,12));

希望能够正常工作

更新1

console.log(myInput.valueAsDate = new Date(Date.UTC(1995, 0, 1));

应该适用于所有时区。


哦,好主意!为了后人,你能发一篇如何将日期转换为GMT日期时间的参考文章吗? - Ionică Bizău
1
还有,有没有什么方法可以忽略时区?我只想显示日期对象中的日期。 - Ionică Bizău
1
new Date(1995, 0, 1,12) 在全球所有时区都能正常工作吗? - Ionică Bizău
@IonicăBizău 我认为你不能忽略时区。但如果你只是使用new Date()来创建它,你的用户将得到他们当前的日期,这是可以接受的。如果你从服务器获取它,而你的网站是全球性的,你应该关心时区。所以它的工作是符合预期的,也许你不应该寻找一个解决方法。 - Bobby Tables
1
我想Date.UTC这个东西是一个不错的解决方案。谢谢 :) - Ionică Bizău

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接