我目前正在考虑实现DateTime本地化的方法,同时考虑用户时区和用户文化,以决定MVC4应用程序的本地时间和日期格式。
目标(如果可能):
- 将用户的本地DateTime转换为UTC日期,以便在控制器和数据库上使用
- 在所有ViewModels/JsonResults中,将UTC转换为用户本地DateTime及其区域性的格式,以便在视图中使用,并在第三方控件的JSON提要中使用
我们系统中的用户都有帐户,他们专门设置了时区和文化设置,所以我永远可以访问这些元素。
本地->UTC(已解决)
对于1。我有一个自定义模型绑定器,它为用户提供本地时间并将时间转换为UTC,工作正常。
UTC->本地
对于2。我不确定解决这个问题的最佳方法是什么。我真的想截取所有DateTime属性,并在将值返回到View或作为JSON对象返回之前,将值从UTC格式化为用户本地时间/区域性。
有没有一种通用的方法可以使用ActionFilter之类的东西来实现这一点?如果我能在一个地方找到一种方法来实现这一点,那就太好了,它可以格式化DateTimes,以便在我的视图和JSON结果中使用。
我知道我可以将其拆分,并在Display/Editor模板中执行,但我遇到的问题是,UTC日期在第三方控件的JSON提要中返回。
几点:
-
是的,您可以使用操作过滤器,但这将假设应用程序中的所有都需要以相同的方式工作。情况可能并非总是如此。
例如,您的某个控制器可能由管理用户使用,该用户可能会看到用户时区中显示的值,而不是他们自己的值。
或者,你的一个屏幕可以安排未来的活动。在这些情况下,存储在UTC或转换到用户的时区是有意义的,而不是,而是将数据保留在事件的原始时区。
-
在我的MVC应用程序中,我更喜欢在控制器和/或模型中对此进行完全控制。如果我想把一个值转换成一个特定的时区,我会在返回之前在控制器中操作模型的属性
-
您可以考虑在模型和控制器中使用
DateTimeOffset
而不是DateTime
。这将使理解不同值之间以及与UTC之间的关系变得更加容易。偏移可以持久化,但DateTimeKind
是隐藏的,并且经常丢失。另请参阅DateTime与DateTimeOffset。 -
如果存储在SQL Server等数据库中,也可以在那里使用
datetimeoffset
。有时这是有意义的,有时存储datetime
或datetime2
仍然有意义。考虑你的选择,选择适合你的。 -
文化性实际上只对常规视图很重要,在常规视图中,您将为用户设置格式。JSON响应应该(最好)是ISO8601格式的,包括偏移量。它应该使用
InvariantCulture
。