16

我的网页上有一个输入,我可以通过获取 ISO 字符串并提取前 10 个字符来设置日期。

date = new Date();
dateInput.value = date.toISOString().substr(0,10);

这完美地工作。我的问题是,当我尝试恢复日期时。我要约一天假。

var newDate = new Date(dateInput.value);

我也尝试了以下代码来弥补它,但它也不总是正确的

新日期(日期解析(元素值)+ 86400000)

所以我的问题是:有没有一种优雅的方法可以始终如一地获得正确的日期。我已经环顾了一段时间,但似乎与 Javascript 中的日期解析没有太大的一致性。

4

6 回答 6

25

如果它是支持浏览器上的实际date输入,那么它将有一个valueAsDateproperty。没有必要解析它。

于 2013-05-29T23:09:26.717 回答
7

它将日期解释为 UTC,对于大多数时区来说,这将使它看起来像“昨天”。一种解决方案可能是将时区偏移添加回日期以将其“转换”为您的本地时区。

于 2013-09-27T17:02:43.260 回答
6
var newDate = new Date(dateInput.value + 'T00:00');

这将在任何时区给出正确的日期。

于 2018-01-25T09:52:45.057 回答
3

您还可以将输入字符串 from 转换YYYY-MM-DDMM/DD/YYYY,然后解析日期以获得正确答案。

例子:

不要使用:

new Date(Date.parse('2018-09-28')) // Thu Sep 27 2018 19:00:00 GMT-0500 (Central Daylight Time)

而是使用

new Date(Date.parse('09/28/2018')) // Fri Sep 28 2018 00:00:00 GMT-0500 (Central Daylight Time)

(注意:我在 CDT)

在 Chrome、Firefox、Safari、旧版 Edge 和 IE 中测试。

于 2018-09-10T18:51:31.173 回答
1

正如 Marty 所说,问题在于输入时区的表示(由 W3C 定义的 UTC)和 JS 时区(本地)之间的差异。解决方案是 getTimezoneOffset (以分钟为单位)并将所有内容转换为毫秒:

var today = document.getElementById("myInputDate").valueAsDate;
var tomorrow = new Date(today.valueOf() + 86400000 + (today.getTimezoneOffset() * 60000));

86400000 = 一天中的毫秒数

today.getTimezoneOffset() * 60000 = timezoneOffset以毫秒为单位

于 2015-10-09T15:42:04.197 回答
0

尝试使用.toLocaleString将日期输入到输入中,并在解析时添加时间,如下所示:

date = new Date();
dateInput.value = date.toLocaleString("sv-SE", {
    hour: "2-digit",
    minute: "2-digit",
    second: "2-digit"
});

并将值放入 Date 对象中,请使用:

new Date(inputdateInput.value + "T00:00");

我在这里写了一篇关于日期对象和日期输入之间转换的小文章

于 2020-06-25T22:10:54.100 回答