2014-08-28 45 views
2

我目前正在考虑实现DateTime本地化的方法,同时考虑到用户时区和用户文化来决定我们的MVC4应用程序的本地时间和日期格式。ASP MVC - 使用时区和文化处理日期时间本地化

的目的(如果可能):

  1. 转换一个用户本地日期时间为UTC对控制器的使用和数据库
  2. 在所有的ViewModels/JsonResults日期,转换UTC到用户本地的DateTime并将其文化格式用于视图中,并用于第三方控件的JSON Feed

我们系统中的用户都有帐户,他们专门设置了他们的时区和文化设置,所以我将永远有权访问这些元素。

地方 - > UTC(解决)

对于1,我有一个自定义的模型绑定,是以用户的本地时间和转换时间为UTC,预期其工作。

UTC - >本地

对于2.我不知道什么是最好的方式来处理这一点。我真的想拦截所有的DateTime属性,并将它们的值从UTC格式化为用户本地时间/文化,然后它们返回到View或作为JSON对象返回。

可以有一种通用的方式,我这样做使用像ActionFilter的东西?如果我能找到一种方法在一个可以格式化DateTime以便在View和JSON结果中使用的地方,那将是非常好的。

我知道我可以将它分开,并在Display/Editor模板中执行此操作,但是我接下来遇到的问题是第三方控件的JSON Feed中返回的UTC日期。

回答

1

的几点:

  • 是的,你可以使用一个动作过滤器,但将作出该无处不在您的应用程序需要的工作方式相同的假设。情况可能并非总是如此。

    例如,管理用户可能使用了其中一个控制器,该用户可能会在用户的时区中显示值,而不是他们自己的值。

    或者你的屏幕可能有一个与未来事件的调度工作。在这些情况下,在UTC中存储而不是或将其转换为用户的时区 - 但要将数据保留在事件的原始时区中。

  • 在我的MVC应用程序中,我更喜欢在控制器和/或模型中完全控制它。如果我想将一个值转换为特定的时区,我在返回之前在控制器中操作模型的属性。

  • 您可能会考虑在模型和控制器中使用DateTimeOffset而不是DateTime。当了解不同的值与UTC和UTC之间的关系时,这会使事情变得更容易一些。偏移量可以保持不变,但DateTimeKind被隐藏起来并经常丢失。另见DateTime vs DateTimeOffset

  • 如果您正在存储在一个数据库如SQL Server中,那么您的可能也在那里使用datetimeoffset。有时这是有道理的,有时它仍然是有意义的存储datetimedatetime2。考虑你的选择,并选择适合你的东西。

  • 文化真的只对定期的意见很重要,你会为用户格式化。 JSON响应应该(最好)是ISO8601格式,包括偏移量。它应该使用InvariantCulture