DateTime ConvertTimeBySystemTimeZoneId无法正常工作

时间:2018-08-31 07:53:56

标签: c# datetime timezone

我将时间保存到数据库中的UTC。

当我从数据库中获取时间数据时,我想将时间转换为本地时区。

这是功能。

    public static List<string> convertListDateTime(List<string> timelist, TimeZoneInfo local)
    {
        for (int i = 0; i < timelist.Count; i++)
        {
            DateTime dt = DateTime.Parse(timelist[i]);
            dt = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dt, local.Id);
            timelist[i] = dt.ToString("yyyy-MM-dd HH:mm:ss");
        }
        return timelist;
    }

timelist是具有数据库数据的字符串列表。

但是时间表不会改变。它与数据库数据相同。

我该怎么办?

1 个答案:

答案 0 :(得分:3)

这是第一个问题:

DateTime dt = DateTime.Parse(timelist[i]);

您尚未说过的值是 ,因此假定它是本地时间。从该时间转换为当地时间是无人值守的。您可以在解析时通过说输入为UTC且您也希望输出也为UTC来解决此问题:

DateTime dt = DateTime.ParseExact(
    timelist[i],
    "yyyy-MM-dd HH:mm:ss",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);

但是,第二,无论如何,您都应该尝试避免所有这些字符串转换:如果将值作为DateTime值而不是字符串存储在数据库中,那么事情就容易很多了。

我也会尽量使用值 as DateTime的值-仅在绝对必要时才转换为字符串,理想情况下作为同时执行时区更改的操作的一部分。

最后,如果您已经拥有ConvertTimeBySystemTimeZoneId,则可以直接使用它,而不是使用TimeZoneInfo

DateTime convertedValue = TimeZoneInfo.ConvertTimeFromUtc(utcValue, zoneInfo);