首页 > 解决方案 > 如何根据我的时区以特定格式获取日期

问题描述

我需要格式化 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

我尝试使用其他语言环境,但结果不同 - 可能取决于服务器语言环境。

标签: javascriptnode.jsdatetimezone

解决方案


ECMAScript 日期对象只是一个时间值,与 1970-01-01T00:00:00Z 之间的偏移量(以毫秒为单位),范围约为 ±285,000 年,因此它们实际上是 UTC。

时间值是在创建日期实例时根据传递给构造函数的值计算的。如果未传递任何值,则根据系统时钟和时区设置计算当前时间值。这是 Date 对象具有的唯一数据值。日期实例的所有其他数据值都是根据时间值计算的(例如getMonthgetHourstoString等,包括它们的 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,'/')
);


推荐阅读