将c#中的所有日期时间字段转换为登录用户的时区的最佳方法是什么



我正在处理一个位于MVC中的项目,该项目有一些页面根据插入database中的时区显示datetime值。现在我的要求是按照管理员或用户登录的时区显示它。实现这一点的最佳方式是什么。

我想把它放在前端,因为我不能在后端更新它。

我有一个userinfo表,它有一个到另一个表的time_zone_id映射列,即为注册用户定义时区的time_zone

除了转到每个控制器并更改日期-时间字段(添加或减去时区)之外,还有其他方法可以实现同样的目的吗?

如果问题没有解决,请告诉我。

没有内置的方法可以在.NET应用程序中全局应用时区更改。如果是这样一种机制,那将是危险的,因为应用程序的不同部分可能需要使用时区,而不仅仅是分配给特定用户的时区。

然而,你还有更大的问题要解决。您在评论中表示,您的时区存储为数值time_in_minutes。这只代表时区偏移,而不是实际的时区

偏移量和时区之间存在显著差异。任何只跟踪偏移的解决方案都无法正确转换世界各地的时间,主要是由于夏令时。请参阅时区标记wiki中的"时区!=偏移量"和dst标记wiki的图形。

此外,您暗示数据库中的时间存储在时区id引用的时区的本地时间。这也是一个问题,因为在回退DST转换期间,您可能存储了不明确的值。

你应该做以下事情:

  • 以UTC或datetimeoffset数据类型存储您的值。(如果您不确定使用哪种,请参阅DateTime与DateTimeOffset。)

  • 在时区表中,应该存储一个包含时区标识符的字符串。您可以在Windows时区或IANA时区之间进行选择。

    • 对于Windows时区,标识符包含像"Eastern Standard Time"这样的值,即使它们实际上代表整个美国东部时区,包括EST和EDT(不要陷入命名差异)。如果您使用这些,那么您将使用.NET代码中的TimeZoneInfo类来进行转换。

    • 对于IANA时区,标识符更为合理,例如"America/New_York""Asia/Tokyo"。你可以在这里找到它们的列表。在.NET中,最简单的方法就是使用Noda Time库。如果有选择,这将是我的建议。

你应该通读时区和dstwiki。我还将推荐以下视频:

  • 时间的问题;时区-电脑爱好者的一个简短而有趣的视频
  • 夏令时解说-CGP Grey制作的一段内容丰富的短片
  • 日期和时间基础-一个全面的Pluralsight培训课程,由我撰写

相关内容

  • 没有找到相关文章

最新更新