我目前正在考虑实施DateTime本地化的方法,考虑用户时区和用户文化来决定我们的MVC4应用程序的本地时间和日期格式。
目标(如果可能):
我们系统中的用户都拥有帐户,并且他们专门设置了他们的时区和文化设置,因此我将始终可以访问这些元素。
本地 - > UTC(已解决)
For 1.我有一个自定义模型绑定器,它将用户本地时间转换为UTC,并将其转换为预期的。
UTC - >本地
对于2.我不确定解决这个问题的最佳方法是什么。我真的想截取所有DateTime属性,并将值从UTC格式化为用户本地时间/文化,然后再返回到View或作为JSON对象返回。
我可以使用类似ActionFilter的方式执行此操作吗?如果我能找到一种方法在一个可以格式化DateTimes以便在我的Views和JSON结果中使用的方法,那就太棒了。
我知道我可以将其拆分出来,并在显示/编辑器模板中执行此操作,但我遇到的问题是在第三方控件的JSON Feed中返回UTC日期。
答案 0 :(得分:1)
几点:
是的,您可以使用操作过滤器,但这会假设应用程序中无处不在需要以相同的方式工作。情况可能并非总是如此。
例如,管理员可能会使用其中一个控制器,他们可能会在用户的时区中看到一个值而不是他们自己的值。
或者您的某个屏幕可能会调度未来事件。在这些情况下,将不存储在UTC中或转换为用户的时区是有意义的 - 但要将数据保留在事件的原始时区中。
< / LI>在我的MVC应用程序中,我更喜欢在控制器和/或模型中完全控制它。如果我想要一个转换为特定时区的值,我会在返回之前操纵控制器中的模型属性。
您可以考虑在模型和控制器中使用DateTimeOffset
代替DateTime
。当理解不同的值如何相互关联以及与UTC相关时,这将使事情变得更容易。可以保留偏移量,但DateTimeKind
被隐藏起来并经常丢失。另请参阅DateTime vs DateTimeOffset。
如果您要存储在SQL Server等数据库中, 也可以在那里使用datetimeoffset
。有时这是有道理的,有时存储datetime
或datetime2
仍然有意义。考虑您的选择并选择适合您的选项。
文化真的只对您要为用户进行格式化的常规视图很重要。 JSON响应应该(最好)是ISO8601格式,包括偏移量。它应该使用InvariantCulture
。