MVC Handling Timezones and JSON Serialization - How to Convert to Specific Timezone
我花了很多时间在stackoverflow和互联网上试图确定在我的情况下做了什么。我正在建设一个
可以跨越多个时区的集中商业网站。根据这里的一些有价值的信息,我有一个计划来处理这个问题。
- 时区将成为用户个人资料的一部分
- 所有日期都将以UTC格式存储
-
EF从数据库检索时将DateTimeKind设置为UTC
是否可以阻止EntityFramework 4覆盖自定义属性? - 为DatePickers和DateDisplays创建一些html助手,将UTC时间转换为本地时间(基于用户时区)
-
使用模型绑定在表单帖子上转换回UTC。
时区战略
现在问题我不知道如何解决。 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
不幸的是,我不知道你使用的很多工具,但我知道如何处理时区。
我会在任何地方使用UTC,除非显示时间(或更确切地说:日期时间)和用户输入。
我会让浏览器的JavaScript使用浏览器的时区在输出中进行转换。在输入中,转换可以在客户端或服务器端完成。在后一种情况下,时区必须是从浏览器发送到服务器的信息的一部分。服务器上的UTC时区应设置为尽可能低的级别,如果可能,应设置在所有组件(OS,Web服务器,DB ...)中。
用户的首选时区对于时区未知的所有情况(例如,在电子邮件通信中 - 但记住总是以时间格式具有时区)仍然有用。
当上述不容易或不适用时,有时(没有双关语......)。例如,一个时间表(日历),用户将他们所拥有的时区附加到他们的头部,而不一定是浏览器的时区。另一种情况是,必须知道用户的时区,因为某些计算无法在浏览器上轻松完成 - 在这种情况下,服务器必须首先从浏览器获取时区。但大部分时间(仍然没有双关语......)你可以愉快地做没有时区(使用UTC),除非在向用户显示某些内容之前或者在从用户那里获得某些内容之后立即显示。
关于你的最后一段:如果你假设"用户档案时区=浏览器时区",你很快就会遇到麻烦。
最后一些建议:
- "时区"是一个含糊不清的术语。它可以指UTC的固定偏移量(如UTC + 1),也可以指给定区域内任何时刻(如罗马,意大利的时区)计算此偏移量的规则。始终使用第二个含义(例如,不要将当前偏移量用于将来或过去的日期,但要正确地来回转换日期时间),并记住两者都可以在用户会话期间更改。
- 小心不要在同一天午夜处理"纯粹"日期(而不是中午也是如此 - 萨摩亚人会感谢你),因为当时区发生变化时,日期会发生变化。换句话说,不要将时间信息附加到纯日期。
P.S。:通过跟随你的链接,我很高兴地发现我完全同意这个答案的结束语(由比我更有声望的人)
我也有这个问题。
这个对我有用。
我把时间格式翻译成了
1 2 3 4 | Start=2016-4-9T8:30:00.000Z End=2016-4-9T13:30:00.000Z |
在背景或数据库中。
通过这样做,本地时区是有用的。
我终于能够在这里找到这个答案https://stackoverflow.com/a/11968692/3412859,这将允许我编写自己的JSONconverter并在序列化之前转换为特定的时区。我现在根据用户配置文件中的时区设置在服务器端转换所有日期。
您当然可以将UTC传递给浏览器并让它转换,但您必须意识到可能存在不准确之处。您也可以转换服务器端并在JSON中传递
最后,你应该做的完全取决于你。许多用例类似,但根据您的具体需求,有许多可接受的不同路径。
你问的方式问题非常广泛。你最关心的部分是什么?剑道? EF? JavaScript的?客户端时区转换?格式化?你可以改进它或为你的日期/时间值代表的事物类型提供一些上下文吗?否则,您可能会获得一些有用的花絮,但很难提供明确的答案。
(哦,你可能会对此感兴趣。)