javascript - 无论时区如何,在 JavaScript 中显示准确日期
问题描述
我正在编写一些简单的代码来显示一些朋友的生日。我已经将生日存储在 JSON 文件中,我将它们拉入并将它们初始化为 Date 对象,如下所示:
birthday: new Date(p.birthday)
然后我使用 moment 显示这些日期来格式化它们,如下所示:
let formatted = moment(birthdayDate).format(BirthdayFormat);
这应用了一个自动本地时区,可能从我设置初始日期对象时开始,并且根据一天中的时间可能会将日期放在过去几个小时,因此将日期更改为前一天,因为它默认为午夜.
基本上,我只想随时显示该日期不变,因为它只是说明该人的生日和时区根本不相关。我在其他地方使用它作为日期,所以我真的不想将它存储在格式化的 JSON 中,那么我该如何设置它以便它只确认日期而不针对时区调整它?
解决方案
根据您的评论,日期采用 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>
推荐阅读
- google-cloud-platform - 如何从 Google Cloud Firestore 下载大量文档?
- regex - 正则表达式解析字符串中的国家/地区
- javascript - 我们可以让变量在 Javascript 中作为 getter 工作吗?
- html - 将鼠标悬停在类的 [li] 元素上
- angularjs - 关闭模态对话框时刷新父组件列表
- javascript - 如何在表单标签中包含依赖下拉列表?
- amazon-s3 - 在两个 s3 存储桶之间复制的骆驼路由静默失败
- java - 如何将 JasperReport 导出为使用 Java 代码生成的 excel 格式以 base64 编码的字符串并对其进行解码
- android-ndk - 转换到新版本 android-ndk-r19 后出现错误
- c++builder - TIdHTTP->Connect() 获取会话ID的授权响应