javascript - 格式化的 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 属性。我怎样才能解决这个问题?
解决方案
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"
推荐阅读
- haskell - 无法使用 cabal 编译 haskell 项目
- c++ - C++ 标准如何使用 memory_order_acquire 和 memory_order_release 防止自旋锁互斥锁中的死锁?
- r - 如何根据 R 中的多个条件创建新列?
- python - 为粗体/下划线字符串查找正确的正则表达式(Python)
- operating-system - 链接标准和自定义动态库有区别吗?
- javascript - 如何访问 iframe 的内部目录
- c - 如何在 C 中调用以下函数?
- html - 如何在页面左侧为我的博客创建侧边栏?
- android - 在 Android DUAL SIM 手机上检测 Sim1 或 Sim2 上的来电
- php - 如何处理长而复杂的 SQL 更新查询?