首页 > 解决方案 > 将 UTC 日期时间转换为本地时间未按预期工作

问题描述

我最近更改了我的网站托管服务提供商,新服务器的时区设置为 UTC。

我已经编写了以下代码,但它没有按预期工作。难道我做错了什么?

当我调用DateTime.Now时,返回的时间确实是 UTC 时间,但据我了解DateTime.Now(传递给方法)应该是 'Kind' Utc。但是该方法返回相同的 UTC 时间,而不是转换为本地时间(期望的结果)。

DEFAULT_TIMEZONE 是字符串常量: AUS 东部标准时间

public static DateTime UTCToLocalTime(DateTime dt, string destinationTimeZone)
{
    DateTime dt_local = dt;
    try
    {
        if (dt.Kind == DateTimeKind.Local)
            return dt_local;
        if (string.IsNullOrEmpty(destinationTimeZone))
            destinationTimeZone = DEFAULT_TIMEZONE;
        TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(destinationTimeZone);
        dt_local = TimeZoneInfo.ConvertTimeFromUtc(dt, tzi);
        if (tzi.IsDaylightSavingTime(dt_local))
            dt_local = dt_local.AddHours(-1);
    }
    catch (TimeZoneNotFoundException)
    {
        AddLogEntry("Registry does not define time zone: '" + destinationTimeZone + "'.");
    }
    catch (InvalidTimeZoneException)
    {
        AddLogEntry("Registry data for time zone: '" + destinationTimeZone + "' is not valid.");
    }
    catch (Exception ex)
    {
        ProcessError(ex);
    }
    return dt_local;
}

调用方法:

DateTime dt = gFunc.UTCToLocalTime(DateTime.Now, string.Empty);

更新:代码更改

我误解了“善良”的工作原理。我想如果操作系统时区设置为UTC,那么对DateTime.Now 的调用将是'Kind' Utc。以下代码现在按预期对我有用。

public static DateTime UTCNowToLocal(string destinationTimeZone)
{
    DateTime dt_now = DateTime.UtcNow;
    try
    {
        if (string.IsNullOrEmpty(destinationTimeZone))
            destinationTimeZone = DEFAULT_TIMEZONE;
        TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(destinationTimeZone);
        dt_now = TimeZoneInfo.ConvertTimeFromUtc(dt_now, tzi);
        if (tzi.IsDaylightSavingTime(dt_now))
            dt_now = dt_now.AddHours(-1);
    }
    catch (TimeZoneNotFoundException)
    {
        AddLogEntry("Registry does not define time zone: '" + destinationTimeZone + "'.");
    }
    catch (InvalidTimeZoneException)
    {
        AddLogEntry("Registry data for time zone: '" + destinationTimeZone + "' is not valid.");
    }
    catch (Exception ex)
    {
        ProcessError(ex);
    }
    return dt_now;
}

标签: c#datetimeasp.net-coreutc

解决方案


推荐阅读