【问题标题】:ASP MVC - Handling DateTime Localization with Timezones and CultureASP MVC - 使用时区和文化处理 DateTime 本地化
【发布时间】:2014-10-22 10:08:24
【问题描述】:

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

目标(如果可能):

  1. 将用户本地 DateTime 转换为 UTC 日期,以便在控制器和数据库上使用
  2. 在所有 ViewModel/JsonResults 中,将 UTC 转换为用户的本地 DateTime 和其文化格式,以便在视图中使用以及在第三方控件的 JSON 提要中使用

我们系统中的用户都有帐户,他们专门设置了时区和文化设置,因此我将始终可以访问这些元素。

本地 -> UTC(已解决)

对于 1. 我有一个自定义模型绑定器,它获取用户本地时间并将时间转换为 UTC,它按预期工作。

UTC -> 本地

对于 2。我不确定解决此问题的最佳方法是什么。我真的很想拦截所有 DateTime 属性,并将值从 UTC 格式化为用户本地时间/文化,然后再返回到视图或作为 JSON 对象返回。

有没有一种通用的方法我可以使用 ActionFilter 之类的东西来做到这一点?如果我能找到一种方法在一个地方执行此操作,该方法将格式化 DateTimes 以便在我的视图和 JSON 结果中使用,那就太好了。

我知道我可以将其拆分出来,并在显示/编辑器模板中执行此操作,但我遇到的问题是在第三方控件的 JSON 提要中返回 UTC 日期。

【问题讨论】:

    标签: c# asp.net-mvc datetime localization timezone


    【解决方案1】:

    几点:

    • 是的,您可以使用操作过滤器,但这会假设您的应用程序中的每个地方都需要以相同的方式工作。情况可能并非总是如此。

      例如,您的某个控制器可能由管理员用户使用,他可能会看到显示在用户时区而不是他们自己时区的值。

      或者,您的某个屏幕可能适用于安排未来活动。在这些情况下,以 UTC 存储或转换为用户的时区是有意义的 - 而是将数据保存在事件的原始时区中。

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

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

    • 如果您存储在 SQL Server 等数据库中,您也可以在那里使用datetimeoffset。有时这很有意义,有时存储datetimedatetime2 仍然有意义。考虑您的选择并选择适合您的选项。

    • 文化真的只对常规视图很重要,您将为用户设置格式。 JSON 响应应该(最好)采用 ISO8601 格式,包括偏移量。它应该使用InvariantCulture

    【讨论】:

      猜你喜欢
      • 2011-12-25
      • 1970-01-01
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      相关资源
      最近更新 更多