【问题标题】:How to get Date according to my timezone with specific format如何根据我的时区以特定格式获取日期
【发布时间】:2020-06-22 21:11:35
【问题描述】:

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

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

【问题讨论】:

  • toLocaleString 的输出未标准化,我得到“22.06.2020”。考虑使用formatToParts 的输出来生成字符串。您可能会发现服务器不支持 toLocaleString 的选项,因此忽略它们。

标签: javascript node.js date timezone


【解决方案1】:

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

时间值是在创建日期实例时根据传递给构造函数的值计算的。如果未传递任何值,则根据系统时钟和时区设置计算当前时间值。这是 Date 对象具有的唯一数据值。日期实例的所有其他数据值都是根据时间值计算的(例如 getMonthgetHourstoString 等,包括它们的 UTC 等价物) 或从系统中检索(例如 getTimezoneOffset)。

因此您不能指定日期的时区,因为它没有时区。使用非 UTC 方法时使用当前系统时区设置,否则也会被忽略。

如果您想获取特定地点(例如以色列)的时间戳,可以将系统设置设置为合适的位置并使用非 UTC 方法。或者,您可以使用Intl.DateTimeFormat 实例的timeZone 选项使用formatToParts 生成一些适当的值,然后根据需要对其进行格式化。

唯一棘手的部分是从 formatToParts 返回的数组中获取值,例如下面使用reduce创建一个parts对象,格式化时使用更方便:

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,'/')
);

【讨论】:

  • 谢谢。第一个选项有效!由于每个服务器上的格式不同,第二个并不总是有效(请参阅问题)。
  • new Date().toLocaleDateString('en-CA', {timeZone:'Asia/Jerusalem'}).replace(/\D/g,'/') 给我'6/24/2020'
  • @user2503775 - 是的,如答案最后一句中所述并由示例演示。它故意的格式不正确。
猜你喜欢
  • 1970-01-01
  • 2019-10-01
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多