首页 > 解决方案 > 格式化的 JavaScript 日期晚了一天

问题描述

我有一个日期:yyyy-mm-dd我正在使用International DateTimeFormat进行格式化,如下所示:

const formatter = new Intl.DateTimeFormat("en-US", { month: '2-digit', day: '2-digit', year: 'numeric', timeZone:'America/Denver'});

// GiVES SAME RESULTS AS ABOVE
//const formatter = new Intl.DateTimeFormat("en-US", { month: '2-digit', day: '2-digit', year: 'numeric'}); 
//const formatter = new Intl.DateTimeFormat("default" , { month: '2-digit', day: '2-digit', year: 'numeric'});

let date = "2020-03-19"
return formatter.format(Date.parse(date));

//returns 03/18/2020 which is one day behind

我已经尝试过使用和不使用 timeZone 属性。我怎样才能解决这个问题?

标签: javascriptdatetime

解决方案


ECMAScript 日期时间字符串格式定义了日期时间形式和仅日期形式的格式。传递字符串时,Date.parse函数和构造函数会使用它们。Date这些函数的行为在 function 的文档中定义其中Date.parse包含以下语句:

...当 UTC 偏移表示不存在时,仅日期形式被解释为 UTC 时间,而日期时间形式被解释为本地时间。

因此,当您调用Date.parse('2020-03-19')定义的行为时,将其视为 UTC,而不是本地时间。(这偏离了 ISO 8601。)

要更改此行为,请附加时间字符串或时间+偏移量字符串。

例如,如果要解析本地计算机时区的时间:

Date.parse('2020-03-19T00:00:00.000')

或者,如果您想在特定时区解析并知道该时区中给定时间戳的正确偏移量:

Date.parse('2020-03-19T00:00:00.000-05:00')

通常人们不知道偏移量,但知道 IANA 时区标识符(例如'America/Chicago')。不幸的是,ECMAScript 目前还没有在指定时区中解析的能力。如果/当采用 TC39 临时提案时,该功能将成为可能。在此之前,您可以使用诸如Luxon 之类的库来执行此类操作。例如:

luxon.DateTime.fromISO('2020-03-19', { zone: 'America/Chicago' }).toString()
//=> "2020-03-19T00:00:00.000-05:00"

推荐阅读