2013-05-29 120 views
12

我在我的网页上有一个输入,我可以通过获取ISO字符串并拔出前10个字符来设置日期。如何解析HTML5日期输入中的日期?

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

这很好。我的问题是,当我试图让日期回来。我得到一天的日期。

var newDate = new Date(dateInput.value); 

我也曾尝试下面的代码,以弥补它,但它并不总是正确的或者

新的日期(Date.parse(element.value)+ 86400000)

所以我的问题是:是否有一个优雅的方式来获得正确的日期一致。我一直在寻找一段时间,但似乎与JavaScript中的日期解析没有太大的一致性。

+0

'date'的值来自哪里? – Achrome

+0

认为你会发现很好的用于momentjs.com – krasu

+0

date = new Date(); – duckbrain

回答

6

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

+1

你是对的。我不再在做这个项目,但这是对这个问题的正确答案。 – duckbrain

+0

@Duckbrain这就是为什么[我问你是什么时区](http://stackoverflow.com/questions/16825363/how-do-you-parse-a-date-from-an-html5-date-input/ 16825411#comment24259218_16825411)... – robertc

19

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

+0

很酷。我不知道那个财产,但它给我同样的问题。日期比我放入盒子的时间晚了一天。我想知道它是否是我的浏览器。我正在使用Chrome 27.0.1453.94米。我在Internet Explorer上尝试过它,它不支持该属性(意外)。 – duckbrain

+1

Firefox根本不支持它。太糟糕了。无论如何,我只需要它在基于Web-kit的浏览器上工作。 (iPhone和Android)。 – duckbrain

+0

@Duckbrain你确定日期是在一天后?你在什么时区? – robertc

1

Javascript日期的getDate()函数是基于零的,而不是一个基于。这里有一个例子:

http://jsfiddle.net/R8Wub/3/

var enteredDate = document.getElementById('dateInput').valueAsDate; 
var result = "Day: " + enteredDate.getDate() + "<br/>" + 
    "Month: " + enteredDate.getMonth() + "<br/>" + 
    "Year: " + enteredDate.getFullYear(); 
document.getElementById('output').innerHTML = "Result is:<br/>" + result; 

选择一个日期,然后点击按钮。请注意,getDate()值将比日历中的月份的日期少一个,因为它基于零。

+0

我知道getDate()方法是基于零的,所以是getMonth(),但是当我得到或在输入中设置值时,我不会调用任何一个。不过谢谢。 – duckbrain

0

正如Marty所说,问题在于输入时区(由wc3c定义的UTC)和JS时区(本地)之间的区别。解决的办法是使用getTimezoneOffset(在分钟)和一切转换为毫秒:毫秒

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

86400000 =毫秒一天的

today.getTimezoneOffset()* 60000 = timezoneoffset的

1
var newDate = new Date(dateInput.value + 'T00:00'); 

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