【问题标题】:Javascript Date is not formatting correctly using `toLocaleString`Javascript 日期未使用 `toLocaleString` 正确格式化
【发布时间】:2018-09-21 03:11:26
【问题描述】:

我正在尝试使用 javascript DatetoLocaleString 函数将日期格式化为“MM/dd/yyyy”(短日期格式)。但是当我更改时区时,它没有给出预期的结果。 Bellow 是我的代码的 sn-p

var d1 = new Date(1954, 0, 1); // Fri Jan 01 1954 00:00:00 GMT-0900 (AKST)
var options = {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit'
};
var shortDate = d1.toLocaleString('en-US', options);
console.log(shortDate);

上面的代码打印12/31/1953,而不是预期的结果01/01/1954

观察/步骤:

  • 将本地机器的时区更改为Whitehorse - Canada(Pacific DayLight Time)。
  • 运行上述代码 sn-p 以复制结果。
  • 它只会在year 值小于1968 的情况下被复制(对于大于1968 的年份可以正常工作)

供参考,上传录音(http://recordit.co/cdWMgWFLKJ

【问题讨论】:

  • 请详细说明“当我更改时区时”的确切含义。照原样,您提供的代码根本没有进行时区转换,并且无论计算机的时区设置如何,都会始终提供01/01/1954
  • 正是,这就是我的期望(不使用时区应该总是返回相同的结果),但没有发生。如果我在本地机器上保留默认时区(GMT+0530 (IST)),它会返回我01/01/1954,而如果我将其更改为美国时区附近的某个位置(例如GMT-0900 (AKST)),它会给我12/31/1953。我正在使用 crome 控制台来测试这个场景。
  • 我想也许您正在构建 d1 与您在此处显示的不同?
  • 我已经添加了相同的小录音请检查link
  • 感谢录制。我相信您已经发现了一个错误,可能与 Mac 上的 Chrome 在操作系统时区更改时如何重新加载其时区数据有关。如果您使用新时区完全关闭并重新启动 Chrome,它是否会给出相同的结果会很有趣。我猜不是。无论哪种方式,您都应该根据此处的指南提交错误报告:chromium.org/for-testers/bug-reporting-guidelines。另请注意,我无法在 Windows 上重现此内容。

标签: javascript date time timezone date-formatting


【解决方案1】:

本地日期时间函数是从 UTC 到本地日期时间的转换。您需要先更改 UTC 时间。

所以用这个吧。

var d1 = new Date(Date.UTC(1954, 0, 1)); // Fri Jan 01 1954 00:00:00 GMT-0900 (AKST)
var options = {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit'
};
var shortDate = d1.toLocaleString('en-US', options);
console.log(shortDate);

【讨论】:

  • 如果输入确实要被解释为该日期的午夜 UTC,那么可以确定 - 这将显示等效的本地时间。但是OP中没有说明这样的要求。
  • 是的,要求仅在本地时区创建和显示Date。一种可能的解决方案是创建 UTC 日期并仅通过将选项属性 timeZone 设置为 UTC 以 UTC 格式显示它。但我试图了解我们仅在本地时区执行所有操作的情况有什么问题。
  • @Ajax 问题是当您创建新日期时,它使用当前时区。如果您更改时区,您会得到一个不同的日期。
猜你喜欢
  • 1970-01-01
  • 2014-02-27
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
相关资源
最近更新 更多