首页 > 解决方案 > 无论时区如何,在 JavaScript 中显示准确日期

问题描述

我正在编写一些简单的代码来显示一些朋友的生日。我已经将生日存储在 JSON 文件中,我将它们拉入并将它们初始化为 Date 对象,如下所示:

birthday: new Date(p.birthday)

然后我使用 moment 显示这些日期来格式化它们,如下所示:

let formatted = moment(birthdayDate).format(BirthdayFormat);

这应用了一个自动本地时区,可能从我设置初始日期对象时开始,并且根据一天中的时间可能会将日期放在过去几个小时,因此将日期更改为前一天,因为它默认为午夜.

基本上,我只想随时显示该日期不变,因为它只是说明该人的生日和时区根本不相关。我在其他地方使用它作为日期,所以我真的不想将它存储在格式化的 JSON 中,那么我该如何设置它以便它只确认日期而不针对时区调整它?

标签: javascriptdate

解决方案


根据您的评论,日期采用 YYYY-MM-DD 格式。不幸的是,ECMAScript 将日期解析为 UTC。

如果日期已经被解析为 UTC,那么您只需向您的用户显示 UTC 值。你可以使用 momentjs 的utc函数(我猜这是它的主要用途之一):

// Built-in parser treats YYYY-MM-DD as UTC
let d = new Date('2020-12-30');
// m inherits the same time value, so is also "UTC"
let m = moment(d);

// Include hour H in format to show effect of utc setting later
let birthdayFormat = 'dddd, D MMMM, YYYY [at] H';

// Default is local timezone, H reflects local offset
// Date might be 29 or 30, depends on whether offset is - or + respectively
console.log('Local: ' + m.format(birthdayFormat));

// Toggle UTC switch, all output will now be UTC, not local
m.utc();

// Values are now UTC, so offset is zero and so is H
// Displays Wednesday, 30 December, 2020 at 0 for all users
console.log('UTC  : ' + m.format(birthdayFormat)); 
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>


推荐阅读