How do you parse a date from an HTML5 date input?

2019-01-24 04:27发布

I have an input on my webpage that I am able to set the date on by getting an ISO string and pulling out the first 10 characters.

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

This works perfectly. My problem is that when I try to get the date back out. I am getting the date one day off.

var newDate = new Date(dateInput.value);

I have also tried the following code to make up for it, but it is not always correct either

new Date(Date.parse(element.value) + 86400000)

So my question is: Is there an elegant way to get the correct date consistently. I have been looking around for a little while, but it seems there is not a lot of consistency with date parsing in Javascript.

5条回答
We Are One
2楼-- · 2019-01-24 04:51

You can also convert the input string from YYYY-MM-DD to MM/DD/YYYY and it then parse the date to get the correct answer.

EXAMPLE:

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)

(NOTE: I am in CDT)

查看更多
等我变得足够好
3楼-- · 2019-01-24 04:55
var newDate = new Date(dateInput.value + 'T00:00');

This will give the correct date in any timezone.

查看更多
家丑人穷心不美
4楼-- · 2019-01-24 04:59

as said by Marty the problem is the difference between the representation of the timezone of the input (UTC defined by W3C) and the JS timezone (local). The solution is to getTimezoneOffset (which is in minutes) and convert everything to milliseconds:

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

86400000 = milliseconds of a day

today.getTimezoneOffset() * 60000 = timezoneOffset in milliseconds

查看更多
5楼-- · 2019-01-24 05:00

It's interpreting the date as UTC, which, for most time zones, will make it seem like "yesterday". One solution could be to add the time-zone offset back into the date to "convert" it to your local timezone.

查看更多
做自己的国王
6楼-- · 2019-01-24 05:00

If it's an actual date input on a supporting browser, then it will have a valueAsDate property. There's no need to parse it.

查看更多
登录 后发表回答