【问题标题】:Inconsistency when converting DateTime to JavaScript将 DateTime 转换为 JavaScript 时的不一致
【发布时间】:2018-11-24 01:01:21
【问题描述】:

我有一个将DateTimeZoneHandling 设置为Local 的 ASP.NET webapi,当转换为 JavaScript 日期时,我得到了两个不同的结果。

示例 1

从服务器返回的日期1932-10-13T00:00:00-04:00

var strDate = new Date("1932-10-13T00:00:00-04:00");

strDate.toISOString();    // 1932-10-13T04:00:00.000Z
strDate.toLocaleString(); // 10/12/1932, 11:00:00 PM

示例 2

从服务器2013-05-09T00:00:00-04:00返回的日期

var strDate = new Date("2013-05-09T00:00:00-04:00");

strDate.toISOString();    // 2013-05-09T04:00:00.000Z
strDate.toLocaleString(); // 5/9/2013, 12:00:00 AM

我预期的行为应该始终是午夜,因为从服务器返回的日期始终是午夜。似乎所有最近的日期都正确解析,但是,过去的日期不正确。

【问题讨论】:

  • 它们是 UTC-4 时区的午夜。 toISOString 将该日期和时间作为 UTC/Zulu 时间(最后是 z)返回,toLocaleString 告诉您您所在时区的日期和时间。
  • @HMR 为什么转换为当地时间的 1932-10-13T00:00:00-04:00 是 10/12/1932, 11:00:00 PM 和 2013-05 -09T00:00:00-04:00 转换 5/9/2013, 12:00:00 AM 但是?那是我不明白的部分。我的期望是他们都将在同一天的午夜,而不是前一天的晚上 11 点
  • 时区和夏令时随着时间的推移发生了几次变化。
  • @HMR 有没有办法解释这些变化?

标签: javascript asp.net-web-api


【解决方案1】:

时区在某些地区可能会有所不同,例如,我是UTC-0300,而在某些季节变化时,它会变为UTC-0200,因此这表明您的地区也改变了偏移量,使其显示时间为一小时较少,主要是因为您的语言环境在一年中采用了不同的偏移量。

下面的示例,我已将您的第一个示例更改为使用与第二个示例相同的日期和月份,以证明您与旧日期无关。

console.log("Example One");
var strDate = new Date("1932-05-09T00:00:00-04:00");

console.log(strDate.toISOString());
console.log(strDate.toLocaleString());

console.log("--------------------------");
console.log("Example Two");

var strDate2 = new Date("2013-05-09T00:00:00-04:00");

console.log(strDate2.toISOString());
console.log(strDate2.toLocaleString());

关于UTC/Zulu time的进一步解释

它已将iso date 标准化为祖鲁日期(零偏移iso date)。它仍然是相同的日期时间,但它已将时区偏移量转换为小时,使时区偏移量为零。

date      [2013-05-09]
separator [T]
time      [00:00:00]
offset    [-04:00]

基本方面是00:00:00.000-04:0004:00:00.000Z 相同。

【讨论】:

  • 但是您是否注意到在第一个示例中 toLocaleString() 转换为晚上 11 点而不是上午 12 点?除非第一个示例中的时区是 UTC-0500,否则没有多大意义 =S
  • @ThiagoLoddi 这很正常,您的地区时区偏移量会发生变化,因为您的国家/州可能会在一年中采用不同的时区,有时会引起混乱。我已经在我的回答中添加了一个解释。
【解决方案2】:

如果您只是想将日期显示为生活在那个时代的人会记住它(在您的情况下,10 月 13 日发生在 10 月 13 日),您可以(ab)使用Moment Timezone,它似乎按预期格式化日期:

moment.tz("1932-10-13T00:00:00-04:00", "America/Toronto").tz("UTC").format();  // 1932-10-13T04:00:00Z

在你的情况下,这个hack技术会产生1932-10-13T04:00:00Z,这可能是你正在寻找的。​​p>

【讨论】:

    猜你喜欢
    • 2019-06-24
    • 2018-11-26
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2011-02-02
    相关资源
    最近更新 更多