javascript - 如何根据我的时区以特定格式获取日期
问题描述
我需要格式化 JavaScript Date 对象。它应该显示以色列日期,格式为:yyyy/mm/dd。
我试过这个 -
const locale = 'he-IL';
const dateOptions = {timeZone:'Asia/Jerusalem',year: 'numeric', month: '2-digit', day: '2-digit'};
console.log( new Date(record.value).toLocaleDateString(locale, dateOptions) )
我从本地计算机获取-
=> 2020-06-22
并从托管在 Amazon Cloud 上的服务器:
=> 06/22/2020
我尝试使用其他语言环境,但结果不同 - 可能取决于服务器语言环境。
解决方案
ECMAScript 日期对象只是一个时间值,与 1970-01-01T00:00:00Z 之间的偏移量(以毫秒为单位),范围约为 ±285,000 年,因此它们实际上是 UTC。
时间值是在创建日期实例时根据传递给构造函数的值计算的。如果未传递任何值,则根据系统时钟和时区设置计算当前时间值。这是 Date 对象具有的唯一数据值。日期实例的所有其他数据值都是根据时间值计算的(例如getMonth、getHours、toString等,包括它们的 UTC 等价物)或从系统中检索(例如getTimezoneOffset)。
所以你不能指定一个日期的时区,因为它没有。使用非 UTC 方法时使用当前系统时区设置,否则它们也会被忽略。
如果要获取特定地点(例如以色列)的时间戳,可以将系统设置设置为合适的位置并使用非 UTC 方法。或者,您可以使用Intl.DateTimeFormat实例的timeZone选项使用formatToParts生成一些适当的值,然后根据需要对其进行格式化。
唯一棘手的部分是从formatToParts返回的数组中获取值,例如以下使用reduce创建一个在格式化时更方便使用的部件对象:
let parts = new Intl.DateTimeFormat('en', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
timeZone:'Asia/Jerusalem'})
.formatToParts(new Date())
.reduce((acc, part) => {
acc[part.type] = part.value;
return acc;
}, Object.create(null));
let timeStamp = `${parts.year}/${parts.month}/${parts.day}`;
console.log(timeStamp);
另一种方法是选择按您想要的顺序包含部分的语言,然后替换分隔符。它的风险更大,因为不同的实现可能对与特定语言或方言相关的格式有不同的想法,例如部分顺序和前导零,例如
console.log(
new Date().toLocaleDateString('he-IL', {timeZone:'Asia/Jerusalem'}).replace(/\D/g,'/')
);
console.log(
new Date().toLocaleDateString('en-CA', {timeZone:'Asia/Jerusalem'}).replace(/\D/g,'/')
);
推荐阅读
- node.js - 将标头发送到客户端后无法设置标头/服务器在页面刷新时崩溃
- python - 在多维数组中使用切片作为变量
- sql - 条件 if else 插入或更新 SQL
- google-chrome - 如何进行扩展以更改网页中的 css
- r - R 反向移植和无效签名
- python - 使用数据框列时 vaex apply 不起作用
- reactjs - 我的 UseEffect 要么无限次调用我的 API 并且我的数据正在显示,要么调用它一次但数据未显示
- react-native - 如何为原生反应设置“样式” - FCM Firebase 云消息传递
- linux - 检测可选的 bash 脚本参数是否设置为 true?
- android - 如何在 android 项目中的特定模块上运行声纳 qube