当我选择日期为12/03/2014时,它会在我输入的前一天返回2014年12月2日星期二16:00:00 GMT-0800(太平洋标准时间)?
<script>
function getAge() {
var today = new Date();
var birthDate = new Date(document.forms["name"]["birth"].value);
var age = today.getFullYear() - birthDate.getFullYear();
var m = today.getMonth() - birthDate.getMonth();
if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate()+1)) {
age--;
}
document.getElementById('age').innerHTML = birthDate;
}
</script>
<form name='name' onsubmit='return false'>
<input type="date" name="birth">
<p id='age'></p>
<button onclick='getAge()'>check</button>
</form>
答案 0 :(得分:0)
错误的日期是由您的时区设置引起的。这是GMT-8。 考虑使用UTC:http://www.w3schools.com/jsref/jsref_toutcstring.asp
答案 1 :(得分:0)
这是一个老问题,但我想重新提出它,因为这是我的 Google 查询中的第一个结果,并且接受的答案并不能很好地回答问题。所以我提供了更多信息供其他人偶然发现。
Date 对象中有几个方便的方法,它们可能对那些试图解决这个 JavaScript 小怪癖的人有所帮助。
在我看来,没有办法以编程方式更改 Date 对象的时区偏移量,必须使用 String 操作来完成,这确实不可取,但没有其他方法。 Date 对象构造函数在解释日期时始终使用本地机器时区,并且无法更改。 因此,您必须了解,当您创建一个基本上忽略时区的 Date 时,更改了Date 对象将代表与原始 Date 不同的时刻。 新的 Date 对象将自动采用本地机器的时区,但它将使用您在各个构造函数参数或字符串中指定的 (year, month, date, hour, min, sec, ms)
Date 类的参数(以下两个选项)。
我找到了两种方法来解决这个问题,并从 type="date"
输入字段生成正确的日期。请使用您认为更有效或更适合您的解决方案的方法。就我个人而言,我更喜欢使用 OPTION B,因为它比字符串操作更具程序性,而且可能更可靠一些。也简单一些。
选项 A:UTC 日期字符串操作
getUTCDate
- 根据世界时返回日期对象的月份中的第几天(从 1 到 31)。 UTC 方法假设日期对象是本地时间和日期来计算它们的日期。
getUTCString
- 根据世界时将 Date 对象转换为字符串。
注意:Date 构造函数恢复到本地时区。因此,您不能使用 getUTCString()
值构建新的 Date 并期望从输入字段中获得正确的日期。< /p>
您可以通过使用 getUTCDate()
并调用 dateObject.setDate(dateObject.getUTCDate());
来解决此问题,它仅更正对象的日期部分,因此您还需要使用 {{1} 更正月份和年份} 和 dateObject.setMonth(dateObject.getUTCMonth());
分别。或者,您可以删除 dateObject.setFullYear(dateObject.getUTCFullYear());
值的 "GMT"
部分之后的所有内容,这将为您提供一个没有指定时区的字符串。然后您可以使用该字符串创建一个新的 Date 对象,该对象将默认为客户端的时区。
getUTCString()
输出:
//convert to UTC to avoid "date minus one" issues where the supplied date is interpreted incorrectly as
//the previous date.
date = new Date(document.getElementById('date').value);
console.log("original date: " + date.toString());
console.log("UTC date string: " + date.toUTCString());
//produces local machine timezone, and therefore incorrect date value
date = new Date(date.toUTCString());
console.log("UTC date string Date constructor: " + date.toString());
utcDate = new Date(utcString.substr(0, utcString.indexOf("GMT")));
console.log("UTC date string Date constructor (without 'GMT*'): " + utcDate.toString());
console.log("UTC date number: " + date.getUTCDate());
date.setDate(date.getUTCDate());
date.setMonth(date.getUTCMonth());
date.setFullYear(date.getUTCFullYear());
console.log("UTC modified date: " + date.toString());
选项 B:向日期构造函数提供所有 UTC 参数 (另见:Create a Date with a set timezone without using a string representation)
示例:
original date: Fri Jan 29 2021 23:16:11 GMT-0600 (Central Standard Time)
UTC date string: Sat, 30 Jan 2021 05:16:11 GMT
UTC date string Date constructor: Fri Jan 29 2021 23:16:11 GMT-0600 (Central Standard Time)
UTC date string Date constructor (without 'GMT*'): Sat Jan 30 2021 23:16:11 GMT-0600 (Central Standard Time)
UTC date number: 30
UTC modified date: Sat Jan 30 2021 23:16:11 GMT-0600 (Central Standard Time)
输出:
date = new Date(document.getElementById('date').value);
console.log("original date: " + date.toString());
date = new Date(
date.getUTCFullYear(),
date.getUTCMonth(),
date.getUTCDate(),
date.getUTCHours(),
date.getUTCMinutes(),
date.getUTCSeconds(),
date.getUTCMilliseconds());
console.log("Date with UTC parameters: " + date.toString());