【问题标题】:MVC Handling Timezones and JSON Serialization - How to Convert to Specific TimezoneMVC 处理时区和 JSON 序列化 - 如何转换为特定时区
【发布时间】:2014-04-17 09:04:45
【问题描述】:

我在 stackoverflow 和互联网上花费了很多时间,试图确定在我的情况下做了什么。我正在建造一个 可以跨越多个时区的集中式业务线网站。根据这里的一些有价值的信息,我有一个计划来处理这个问题。

现在是我不知道如何解决的问题。 Kendo UI 使用 JSON 来回传递信息,据我所知 JSON.net 序列化程序无法将日期序列化到特定时区。我可以将日期序列化为 UTC,或者让 JSON.net 使用 DateTimeZoneHandling 设置自动将其转换为本地时间,但这将是服务器上的本地时间。通过查看 JSON.net 代码,我不确定我什至可以编写一个转换器来做我想做的事情。到目前为止,如果我通过 JSON.net 以 UTC 格式发送日期,Kendo 会自动将时间转换为浏览器的本地时区。

假设用户配置文件时区 = 浏览器时区对我来说似乎有点吓人,我想看看 stackoverflow 建议我做什么。提前谢谢你。

技术

ASP.net MVC 5

实体框架 6

Telerik Kendo UI 控件

JSON.net

【问题讨论】:

    标签: timezone json.net .net-4.5 asp.net-mvc-5 entity-framework-6


    【解决方案1】:

    很遗憾,我不知道您使用的许多工具,但我知道如何处理时区。

    我会在任何地方使用 UTC,除了显示时间(或者更确切地说:日期时间)和用户输入时。

    我会让浏览器的 JavaScript 使用浏览器的时区在输出中进行转换。在输入中,转换可以在客户端或服务器端完成。在后一种情况下,时区必须是从浏览器发送到服务器的信息的一部分。服务器上的 UTC 时区应设置为尽可能低的级别,如果可能,应在所有组件(操作系统、Web 服务器、数据库...)中设置。

    尽管如此,用户的首选时区仍然适用于时区未知的所有情况(例如,在电子邮件通信中 - 但请记住始终使用时间格式的时区)。

    有时(没有双关语......)上述内容并不容易或不适用。例如,时间表(日历),用户将他们脑海中的时区附加到该时间表上,不一定是浏览器的时区。另一种情况是当用户的时区必须知道一些在浏览器上不容易完成的计算时——在这种情况下,服务器必须首先从浏览器获取时区。但大多数时候(仍然没有双关语...)您可以愉快地不使用时区(使用 UTC),除非是在向用户展示某些内容之前或从用户那里获得某些内容之后。

    关于你的最后一段:如果你假设“用户配置文件时区 = 浏览器时区”,你很快就会遇到麻烦。

    最后的忠告:

    • “时区”是一个模棱两可的术语。它可能指的是与 UTC 的固定偏移量(如 UTC+1),或用于在给定区域(如意大利罗马的时区)的任何时刻计算此偏移量的规则。始终使用第二种含义(例如,不要将当前偏移量用于未来或过去的日期,而是正确地来回转换日期时间),并记住两者都可以在用户会话期间发生变化。
    • 注意不要将“纯”日期处理为同一天的午夜(也不是中午 - 萨摩亚人会感谢您),因为这样日期可能会随着时区的变化而变化。换句话说,不要将时间信息附加到纯日期。

    P.S.:通过点击你的链接,我很高兴地发现我完全同意 this answer 的结束语(由比我更有声望的人)

    【讨论】:

    • 谢谢你的回答,很多事情我没有在这里考虑。我可能最终会回到 js 进行转换,但现在我要继续我开始的道路。
    • @user3412859,不客气。您可以通过显示来自用户个人资料的时区的首字母缩写词来降低出现问题的几率,每次 ;-)(好吧,不要忘记有两种:一种有 DST,另一种没有 DST)
    【解决方案2】:

    您当然可以将 UTC 传递给浏览器并让它转换,但您必须注意 potential for inaccuracies。您还可以转换服务器端并在 JSON 中传递 DateTimeOffset,但您可能需要自己渲染它,使用类似 moment.js 的东西。

    最后,你应该做什么完全取决于你。许多用例是相似的,但有很多可接受的不同路径取决于您的具体需求。

    您提出的问题非常广泛。你最关心的部分是什么?剑道?英孚? JavaScript?客户端时区转换?格式化?您能否对其进行改进或为您的日期/时间值所代表的事物类型提供一些背景信息?否则,您可能会得到一些有用的花絮,但很难提供明确的答案。

    (哦,你可能对this感兴趣。)

    【讨论】:

    • 感谢您的回答。我想我的具体问题是关于如何在使用 JSON.net 进行序列化之前设置特定的时区,我终于能够找到它。你发给我的最后一个链接与我使用 Model Binder 所做的类似。
    【解决方案3】:

    我终于能够在https://stackoverflow.com/a/11968692/3412859 找到这个答案,这将允许我编写自己的 JSONconverter 并在序列化之前转换为特定时区。我现在根据用户配置文件中的时区设置在服务器端转换了所有日期。

    【讨论】:

      【解决方案4】:

      我也有这个问题。

      它对我有用。

      我把时间格式翻译成

       Start=2016-4-9T8:30:00.000Z
      
      
       End=2016-4-9T13:30:00.000Z
      

      在后台或数据库中。

      通过这样做,本地时区很有用。

      【讨论】:

        猜你喜欢
        • 2016-06-29
        • 1970-01-01
        • 2020-03-21
        • 2019-01-06
        • 2022-11-30
        • 2014-08-12
        • 1970-01-01
        • 1970-01-01
        • 2018-11-28
        相关资源
        最近更新 更多