Javascript日期有一天的偏差吗?
Javascript日期有一天的偏差吗?
我正在尝试在我的应用程序中使用一个简单的日期函数,以yyyy-mm-dd
的格式传递日期,例如2017-07-30
,并将其返回为07/30/2017
的格式。\n然而,当我尝试这样做时,我正确提供了日期,但输出结果比我期望的少一天。\n
function format(inputDate) { var date = new Date(inputDate); if (!isNaN(date.getTime())) { var day = date.getDate().toString(); var month = (date.getMonth() + 1).toString(); // 月份使用0索引。 return (month[1] ? month : '0' + month[0]) + '/' + (day[1] ? day : '0' + day[0]) + '/' + date.getFullYear(); } } console.log(format('2017-07-30'));
\n这是一个fiddle链接:http://jsfiddle.net/49pptrj4/\n有什么想法为什么返回结果不正确吗?\n我这边的结果:\n
Javascript日期会出现一天的偏差的问题,是因为在解析日期字符串时,Date.parse()
方法会根据不同的格式假设不同的时区。如果日期字符串是"March 7, 2014"这样的格式,Date.parse()
会假设为本地时区。但是如果日期字符串是ISO格式的"2014-03-07",Date.parse()
会假设为UTC时区。
由于浏览器会将UTC时间转换为本地时区时间,因此如果你所在的时区比UTC晚几个小时(如美洲地区),就会导致结果比实际日期晚一天。
为了解决这个问题,可以通过以下代码在本地时区创建一个具有正确日期的Date对象:
utcDate = new Date("2017-07-30"); //Date对象比实际日期晚一天 new Date(utcDate.getTime() + utcDate.getTimezoneOffset() * 60000) //本地日期
上述代码通过根据时区差异添加时间来创建本地日期。getTimezoneOffset()
返回的是分钟数,所以需要乘以60000转换为毫秒数。
需要注意的是,在UTC之前的时区可能无法正常工作,可能会提前一天。
编辑:刚刚检查了一下,getTimezoneOffset()
在UTC之前的时区是负值,因此它会正确地减去时间。