操作datetimeoffset到本地用户设置区域

时间:2014-05-20 12:12:55

标签: c# datetime datetimeoffset

如果我采取正确的方法处理此事,请告诉我:

我有一个网络应用程序,我希望根据用户的时区向用户显示本地化操作日期时间。

例如:用户x在此日期创建了此用户,用户y在此日期修改了此项目,依此类推。

将所有这些操作保存为DateTimeOffset而不是DateTime类型是否可以,当向用户显示时,将DateTimeOffset转换为用户本地时区?

3 个答案:

答案 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。