如果你有过使用 JavaScript 的日期对象的经验,你可能会发现有时候获取的日期比实际日期早了一天。这种情况很常见,但是它为什么发生呢?这篇文章将介绍原因及其解决方法。
问题原因
假设你使用以下代码创建一个日期对象:
const date = new Date('2023-04-07'); console.log(date);
输出结果应该是类似这样:
Fri Apr 07 2023 00:00:00 GMT+0800 (China Standard Time)
然而,如果你尝试打印出日期的时间戳,你会惊奇地发现它比你期望的少了一天:
console.log(date.getTime()); // 1657190400000
这是因为在 JavaScript 中,日期对象默认使用本地时区来表示时间。 在中国时区,UTC+8 是当前的标准时区偏移量。当我们创建日期对象时,它会被解析成 UTC 时间并转换为本地时间。例如,在北京时区,如果你运行以下代码:
const date = new Date('2023-04-07T00:00:00Z'); console.log(date);
你会看到以下输出:
Fri Apr 07 2023 08:00:00 GMT+0800 (China Standard Time)
这是因为 'Z' 表示 UTC,所以我们得到了 UTC 时间,加上 8 小时的本地时区偏移量,得到了我们期望的时间。
但是,如果你只传入日期字符串而没有指定时间格式,JavaScript 会默认将它解析为 UTC 日期。例如,在北京时区,以下代码:
const date = new Date('2023-04-07'); console.log(date);
将得到以下输出:
Thu Apr 06 2023 08:00:00 GMT+0800 (China Standard Time)
这是因为在 UTC 时间中,北京时区与 UTC+8 之间有 8 小时的差距,所以我们看到的时间比我们期望的早了一天。
解决方法
要解决这个问题,我们需要将日期字符串转换成本地时间。有几种方法可以做到这一点。以下是其中的两种方法。
方法一:使用 Date.parse()
Date.parse() 方法可以接受一个日期字符串并返回与之对应的时间戳。我们可以将日期字符串转换为时间戳,然后使用该时间戳创建一个新的日期对象。
const date = new Date(Date.parse('2023-04-07')); console.log(date); // Fri Apr 07 2023 00:00:00 GMT+0800 (China Standard Time)
方法二:使用 moment.js 库
moment.js 是一个流行的 JavaScript 库,可以简化日期和时间操作。它提供了一个方便的方法来将日期字符串转换为本地时间。
首先,安装 moment.js:
npm install moment
然后,使用以下代码:
const moment = require('moment'); const date = moment('2023-04-07').toDate(); console.log(date); // Fri Apr 07 2023 00:00:00 GMT+0800 (China Standard Time)
总结
在 JavaScript 中创建日期对象时,如果没有明确指定时间格式,则默认将其解析为 UTC 日期。这可能会导致日期偏移量错误的问题。我们可以通过将日期字符串转换成本地时间来解决这个问题。Date.parse() 方法和 moment.js 库都是有效的解决方案。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/10023