【发布时间】:2011-01-26 18:39:39
【问题描述】:
我正在使用 .Net 3.5 开发 C# 应用程序。我有用户的时区值以这种格式 (-05:00,1) 存储在数据库中,其中 -5.00 代表 EST 时区值,1 表示这个时区遵循夏令时(如果 0 不是夏令时)。
考虑到夏令时值,现在我想将任何日期时间值转换为此时区值。
感谢任何帮助。谢谢
【问题讨论】:
我正在使用 .Net 3.5 开发 C# 应用程序。我有用户的时区值以这种格式 (-05:00,1) 存储在数据库中,其中 -5.00 代表 EST 时区值,1 表示这个时区遵循夏令时(如果 0 不是夏令时)。
考虑到夏令时值,现在我想将任何日期时间值转换为此时区值。
感谢任何帮助。谢谢
【问题讨论】:
为什么不获取 GMT0 并添加用户延迟 (+/-)?
【讨论】:
只有一个偏移量以及它是否处于夏令时并不足以指示一个时区:可以有多个时区具有相同的标准偏移量和 DST 偏移量,但在不同时间有 DST 转换.
这些数据是否已经在数据库中,或者您仍在设计它?理想情况下,您应该存储一个时区 ID - TimeZoneInfo 使用的是 Windows ID,这不是理想的 IMO(我更喜欢其他行业倾向于使用的 IANA/Olson ID),但至少它确实如此代表一个实时时区。
一旦你有了一个TimeZoneInfo 和一个你想要转换的瞬间,ConvertTimeFromUtc 和 ConvertTimeToUtc 可能就是你想要的 - 但要小心你所说的“任何日期时间值”是什么意思;您需要确保您始终准确了解您所代表的内容。
BCL 在所有这些方面都有些模糊,这是我开始 Noda Time 的原因之一,它允许使用 IANA 时区数据以及 BCL。
【讨论】:
为此使用DateTime.ParseExact()。但这不支持 DST 指标。
【讨论】:
@skeet 关于时区是正确的。相信我,他们疯了。你有像印度这样的地方,有 0.5 小时的休息时间。像委内瑞拉这样的地方刚刚改变了他们的时区。像美国这样的地方会更改其 DST 的开始和结束日期。您必须记住,时区受制于国家的政治意愿,并且它们确实会发生变化(比您想象的更频繁)。使用时区 id 而不是尝试跟踪数据库中的偏移量。
如果您还没有弄清楚,如果您必须处理时区,使用 DateTimeOffset 将使您的生活轻松 100 倍。
【讨论】: