当我将日期时间存储在数据库中时,我希望将时间转换为通用时间,并在从数据库中检索时转换回系统时间。
他们两个我通过创建函数 ConvertToLocalTime()完全成功了 和 ConvertToUniversalTime()。
转换为当地时间的代码如下:
public void ConvertToLocalTime()
{
string szTimezoneinfoid = TimeZoneInfo.Local.Id.ToString();
TimeZoneInfo tzInfo = TimeZoneInfo.FindSystemTimeZoneById(szTimezoneinfoid);
this.m_dtCreatedDate = TimeZoneInfo.ConvertTimeFromUtc(m_dtCreatedDate, tzInfo);
}
当我调用函数 Shipment.ConvertToLocalTime()时,它会将出货创建日期更改为当地时间,直到它正常工作。
现在,如果我再次调用 Shipment.ConvertToLocalTime(),它会再次将当地时间视为UTC并将其转换为当地时间。
如果已经在当地时间,有没有办法阻止转换到当地时间?
我们有什么方法可以获得日期时间的时区吗?
答案 0 :(得分:2)
TimeZoneInfo.ConvertTimeFromUtc
的结果是DateTime
Kind
Unspecified
,除非时区本身是UTC。
当您将该结果传递到TimeZoneInfo.ConvertTimeFromUtc
时,它会假设您理解它是UTC DateTime
- 否则您将不会调用ConvertTimeFromUtc
。 ..
基本上,DateTime.Kind
是试图解决DateTime
试图代表太多不同事物的问题的黑客行为。您的方法从可能含糊不清的数据开始,最终会出现含糊不清的数据......但这并不是好兆头。
要么你可以确保你总是知道你正在做什么,并避免用自己的结果调用你的方法,或者你可以考虑使用Noda Time,我的替代.NET日期/时间API,避免这个通过使用不同的数据类型来表示不同类型的数据。
答案 1 :(得分:1)
我不确定您的示例中究竟出现了什么问题,但如果您只是想从数据库获取您知道的UTC日期/时间并将其转换为本地时间,则可以执行以下操作:
var dbTime = //whatever, from database.
var utcTime = DateTime.SpecifyKind(dbTime, DateTimeKind.Utc);
var localTime = utcTime.ToLocalTime();
在我自己的项目中,我首先检查dbTime.Kind != DateTimeKind.Local
,以防我的数据阅读器决定开始为我执行转换。