日期时间时间从UTC转换为本地两次

时间:2012-10-02 10:26:44

标签: c#

当我将日期时间存储在数据库中时,我希望将时间转换为通用时间,并在从数据库中检索时转换回系统时间。

他们两个我通过创建函数 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并将其转换为当地时间。

如果已经在当地时间,有没有办法阻止转换到当地时间?

我们有什么方法可以获得日期时间的时区吗?

2 个答案:

答案 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,以防我的数据阅读器决定开始为我执行转换。