1

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

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

如果已经是本地时间,有什么方法可以阻止转换为本地时间?

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

4

2 回答 2

2

的结果TimeZoneInfo.ConvertTimeFromUtc是 aDateTime和 a KindUnspecified除非时区本身是 UTC。

当您将该结果传递给 时TimeZoneInfo.ConvertTimeFromUtc,它将假定您将其理解为 UTC DateTime- 否则您不会调用ConvertTimeFromUtc...

基本上,DateTime.Kind这是一种试图解决DateTime试图代表太多不同事物的问题的技巧。您的方法以可能不明确的数据开始,并以不明确的数据结束......这不是好兆头。

您可以确保始终知道自己在做什么,并避免使用自己的结果调用您的方法,或者您可以考虑使用Noda Time,这是我的替代 .NET 日期/时间 API,它通过使用不同的方法来避免此类事情数据类型来表示不同类型的数据。

于 2012-10-02T10:32:04.807 回答
1

我不确定您的示例中到底出了什么问题,但是如果您只是想从数据库中获取您知道是 UTC 的日期/时间并将其转换为本地时间,您可以执行以下操作:

var dbTime = //whatever, from database.
var utcTime = DateTime.SpecifyKind(dbTime, DateTimeKind.Utc);
var localTime = utcTime.ToLocalTime();

在我自己的项目中,我dbTime.Kind != DateTimeKind.Local首先检查,以防我的数据阅读器决定开始为我执行转换。

于 2012-10-02T10:32:48.750 回答