Javascript日期有一天的偏差吗?

10 浏览
0 Comments

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\"enter

0
0 Comments

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之前的时区是负值,因此它会正确地减去时间。

0