我正在一个项目中,在MVC
该项目中有一些页面会datetime
按插入的时区显示值database
。现在,我的要求是按照管理员或用户登录所在的时区显示它。实现这一目标的最佳方法是什么。
我想在前端使用它,因为我无法在后端更新它。
我有一个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(不要陷入命名差异)。如果使用这些,则将使用TimeZoneInfo
.NET代码中的类进行转换。
对于IANA时区,标识符更合理,例如"America/New_York"
或"Asia/Tokyo"
。您可以在此处找到它们的列表。在.NET中,使用它们的最简单方法是使用Noda Time库。如果有选择,这将是我的建议。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句