c# - 将 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++ - 是否有一种方法可以通过代码使用重载运算符确定在预先存在的项目中调用类 X 中的 = 运算符的位置?
- java - 用于文件上传的 PowerMockito 测试
- python - Python 3.9:async_generator 不能用于“等待”表达式
- javascript - Discord.js/voice 如何创建音频资源?
- sql - 从 GROUP BY 中除以总和
- javascript - JS+ASP Net Core 从控制器获取数据
- python - Numpy: if then else on new column ,对 THEN 和 ELSE 使用新字符串
- google-sheets - 使用不同的功能,但无法正确使用
- python - 找不到与 Python 3 匹配的内核。请选择一个内核
- genexus - 从 Genexus 中的智能设备网格中删除记录时出现“未授权”错误