如果我采取正确的方法处理此事,请告诉我:
我有一个网络应用程序,我希望根据用户的时区向用户显示本地化操作日期时间。
例如:用户x在此日期创建了此用户,用户y在此日期修改了此项目,依此类推。
将所有这些操作保存为DateTimeOffset
而不是DateTime
类型是否可以,当向用户显示时,将DateTimeOffset转换为用户本地时区?
答案 0 :(得分:2)
首先,DateTimeOffset优先于DateTime进行应用程序开发。请参阅此MSDN页面:Choosing Between DateTime, DateTimeOffset, and TimeZoneInfo
其次,我想指出,如果您使用DateTime,您必须在保存之前将用户输入的DateTime数据转换为UTC,以便您可以将其正确地转换为用户&#39当地时间晚些时候。如果使用DateTimeOffset,则无需转换为UTC - 只要确保存在日期和时间组件即可。日期组件有助于确定夏令时是否对用户的时区有效。
答案 1 :(得分:1)
你必须考虑到
虽然DateTimeOffset值包含偏移量,但它不是完全的 时区感知数据结构。虽然与UTC的偏差是一个 时区的特征,它没有明确地识别出一个 时区。多个时区不仅共享相同的偏移量 UTC,但是如果观察到单个时区的偏移则会发生变化 夏令时。这意味着,只要一个DateTimeOffset 价值与其时区分离,不再是 毫不含糊地链接回原来的时区。
为什么不在保存到数据库之前使用DateTime .ToUniversalTime
,然后在检索数据时将其转换为用户本地格式以显示它?我认为这是一个更安全的选择。
答案 2 :(得分:0)
我假设您会在采取行动时注册并存储日期和时间。每次发生事情时我都会将它们注册为DateTime.UtcNow
。
通过这种方式,您可以确定何时实际发生了某些事情而无需担心用户触发它的时区。这将是第一步。然后,您可以开始考虑如何使用用户时区向用户显示它们的替代方法;这将更容易做到。对于这种国际化时间问题,您可以考虑查看Noda Time等API。