这里有一个棘手的情况。我们的应用程序在一个使用特定TimeZone设置的系统中运行(比如亚洲时间)。但是,客户要求使用欧洲时区运行他的应用程序。
由于我们的数据没有以UTC格式存储,我们是否可以在应用程序中设置区域设置,以便显示的所有日期都使用欧洲TimeZone?我知道我们可以在Web.Config上设置文化信息,但我不确定这是否也可以帮助设置TimeZone。
BTW我们的应用程序正在使用C#WebForm和MSSQL 2008 R2运行。
答案 0 :(得分:2)
存储的数据与您选择显示的方式完全不同。假设日期和时间用于表示固定时间点(而不是浮动“本地”时间),我会尝试使用UTC中的DateTime
值尽可能多地编写应用程序。当您检索数据时,如果需要,将其从“存储时区”转换(您没有说存储数据的区域),并在存储时将其转换回来。当您显示时,将其显示在您需要的任何时区。
就.NET而言,您无需在全局级别设置此项 - 您可以在应用程序范围内配置设置(如果您确实需要)和“帮助程序”代码,以便在需要时进行转换显示。我会非常明确地这样做:你真的不希望在涉及到时间的东西时隐式发生转换。
(我还提到我的Noda Time库在日期和时间方面可能会作为一个更清晰的API。我当然有偏见。我还建议迁移到存储一切在UTC中,如果你能......当然只在适当的地方。)
答案 1 :(得分:1)
您应该使用DateTimeOffset
存储日期:
表示某个时间点,通常表示为日期和时间 日,相对于协调世界时(UTC)。
使用DateTimeOffset
具有很大的优势,因为这些日期可以轻松转换为任何时区而不会丢失事件发生的偏移(即在某个时刻存储一些数据)。
正如Jon Skeet在我的回答中的评论中所建议的那样,时区标识符应与DateTimeOffset
一起存储,以便获得完整日期+时间信息并使其完全可兑换。
另一方面,您可能无法将数据存储在特定时区,但使用<{1}} 按存储整个时区标识符,以及稍后您将根据应用程序层中的用户配置文件或应用程序范围的时区和/或文化设置将其转换为所需的时区。
最后,您可以使用this TimeZoneInfo.ConvertTime(DateTimeOffset, TimeZoneInfo)
overload.
DateTimeOffset