【问题标题】:Time Zone difference in browsers浏览器中的时区差异
【发布时间】:2015-12-18 05:24:25
【问题描述】:

我正在使用以下字符串语法通过 JSON 从数据库中检索 DateTime 字段:

2015-12-17T12:00:00

我将其转换为如下日期:

<script>
   var myDate = new Date("2015-12-17T12:00:00");
   document.write(myDate);
</script>

问题是 Safari 和 Chrome 假定这是 UTC 时间(这是我想要的方式),而 IE 假定这是本地时间。

Chrome/Safari 的示例输出:

Thu Dec 17 2015 17:30:00 GMT+0530 (India Standard Time)

IE Edge/11/10 的示例输出

Thu Dec 17 2015 12:00:00 GMT+0530 (India Standard Time)

在此处查看 Plunker:http://plnkr.co/edit/tQAqmdWAuL8k0vGKPLCx?p=preview

如何纠正这种行为?

【问题讨论】:

    标签: javascript datetime cross-browser timezone


    【解决方案1】:

    没关系,我找到了解决方案。在日期末尾添加“Z”:

    015-12-17T12:00:00Z
    

    【讨论】:

    • 没错,但最好的解决方案是让后端在序列化期间包含 Z。大多数序列化程序在正确配置时都会这样做。如果您提供有关后端的一些详细信息,我可能会提供有关如何正确执行此操作的建议。
    • 我们使用 ASP.Net Web API 返回 C# 对象。使用 Dapper 从数据库中填充对象。
    • 当您从数据库加载DateTime 对象时,它们的.Kind 属性可能默认设置为DateTimeKind.Unspecified。如果它们实际上是 UTC,则使用 DateTime.SpecifyKind 在加载时立即设置 DateTimeKind.Utc。您可以每次手动执行此操作,也可以在 dapper 中设置 TypeHandler 为您执行此操作。或者,在 SQL 中存储 datetimeoffset 并在 .NET 中使用 DateTimeOffset 类型(对于 UTC,偏移量设置为 +00:00)。无论哪种方式,一旦完成,JSON.net 中的序列化将正确添加Z 或偏移量。
    • 非常感谢。现在适合我的最简单的解决方案是 new Date(usr.LastAccess+'Z') 。我稍后会重新讨论并在后端完成一些事情(这完全是另一个团队的故事!)
    • 您还应该考虑moment.js。你可以使用moment.utc(usr.lastAccess)
    【解决方案2】:

    试试这个:

    <script>
       var myDate = new Date("2015-12-17T12:00:00").toUTCString();
       document.write(myDate);
    </script>
    

    【讨论】:

    • @navigator 我无法投票,但是是的,您的解决方案将起作用。 :) (Y)
    • 您正在转换回字符串。我不能这样做,因为我需要对 datetime 变量执行进一步的操作。
    • 是的,这是我的想法,但我找到了您在发布我的解决方案后给出的解决方案。没问题,您的解决方案在您的情况下会更好。
    • 这不是一个好的解决方案,因为它会以与原始问题中提到的相同的不一致方式解释时间。此外,ES5 和 ES6 之间的行为发生了变化,因此实现会有所不同。
    • 感谢@MattJohnson,您的评论将帮助其他人不要这样做:)
    猜你喜欢
    • 1970-01-01
    • 2012-04-12
    • 2014-04-12
    • 1970-01-01
    • 2011-11-28
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    相关资源
    最近更新 更多