【发布时间】:2012-02-06 12:42:33
【问题描述】:
我正在构建一个 MVC 3 应用程序,其中用户可能不在同一个时区,所以我的意图是以 UTC 存储所有内容,并在视图中从 UTC 转换为本地时间,在提交时将本地时间转换为 UTC。
虽然似乎没有很多好的解决方案,但进行一些浏览。老实说,我有点期望至少有一个属性可用于将 UTC 时间自动转换为本地时间,但它似乎不存在。
我觉得只是努力将每个输入手动转换为 UTC 并将每个视图手动转换为本地时间显示将非常容易出错,并导致难以检测到时间未转换为或从哪里转换的错误。
关于如何将其作为一般策略处理的任何建议?
编辑 每个人似乎都非常坚持“我如何获得客户端时区”这一块,正如我在其中一个 cmets 中提到的那样,这不是我关心的问题。我对确定他们的时区的用户设置很好,所以假设我已经知道客户端时区是什么......这不能解决我的问题。
现在,在我渲染日期的每个视图上,我都需要调用一个方法以从 UTC 在本地时区渲染它。每次我向服务器发送提交日期时,我都需要将其从本地时区转换为 UTC。如果我忘记执行此操作,将会出现问题...提交的日期会出错,或者客户端报告和过滤器会出错。
我希望存在的是一种更自动化的方法,特别是因为视图模型在 MVC 3 中是强类型的,我希望 sum magic 至少能够在时区自动呈现,如果不处理提交,就像日期格式或范围可以由属性控制一样。
很喜欢
[DateRange]
Public DateTime MyDate
我可以有类似的东西
[ConvertToUTC(offset)]
Public DateTime MyDate
无论如何,我想我唯一的方法是编写自定义数据注释以在时区中呈现它,并覆盖 MVC 3 模型绑定器,以便转换传入日期,除非我想包装任何日期在方法调用中。因此,除非有人有进一步的 cmets 或建议,否则它将是这两个选项之一,我只是很惊讶不存在这样做的东西。
如果我确实实施了解决方案,我一定会发布它。
编辑 2 我正在寻找类似 This http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx for MVC 3 视图和视图模型的东西。
最终编辑 我将 Epignosisx 的答案标记为正确,但还有一些 cmets 需要添加。 我在这里发现了类似的东西: http://dalldorf.com/blog/2011/06/mvc3-timezones-1/ 通过将时区放在第 2 部分中想要的人的 cookie 中,从客户端获取时区的实现(下面的链接,因为文章第一部分到第 2 部分的链接不起作用) http://dalldorf.com/blog/2011/09/mvc3-timezones-2/
重要的是要注意这些方法,您必须使用 Editfor 和 Displayfor 而不是 TextForFor 之类的东西,因为只有 EditFor 和 DisplayFor 使用元数据提供程序来告诉 MVC 如何在模型上显示该类型的属性。如果您直接在视图 (@Model.MyDate) 中访问模型值,则不会发生转换。
【问题讨论】:
-
我目前在 C# 和 SQL Server 中都使用 DateTimeOffset。思考同样的问题,但不知道我会在哪里结束。您可能会在 Daylight saving time and Timezone best practices 和 The Death of DateTime? 找到一些有用的信息。
-
JavaScript 可以做到...您通过
Date.UTC(...)创建一个日期对象,然后调用.getTimezoneOffset()来计算当地时间... -
@vidas 但是我仍然在手动转换每个日期时间
-
考虑使用一些会试图阻止您使用幼稚日期时间的东西。 (即,没有时区的日期时间) - Python 的日期时间在这方面非常出色,但也许 Nodatime 会有所帮助。
-
我总是以 UTC 格式保存,但使用包含其时区信息的结构(夏令时也需要)。由于我知道用户时区,我可以将其转换为预期的 UTC,并使用自 1970 年以来的秒数转换为 JavaScript 日期。我的结构基于此:stackoverflow.com/questions/246498/…
标签: c# javascript asp.net-mvc-3 timezone utc