Linux Ubuntu环境下C#处理夏令时解决EST转UTC时间偏差问题
问题根因
- 夏令时判断逻辑错误:你需要判断的是美国东部时区的夏令时状态,而非服务器本地时区的状态。你使用
TimeZoneInfo.Local调用IsDaylightSavingTime,如果Ubuntu服务器的本地时区没有设置为America/New_York,返回结果自然和预期不符。 - 手动调整时间属于多余操作:
TimeZoneInfo.ConvertTimeToUtc本身已经内置了夏令时偏移的自动计算逻辑,你额外添加的夏令时减1小时操作,才是导致转换结果多1小时的直接原因。
修复方案
修正后的代码
private DateTime ConvertToUTCHHmm(DateTime dateValue) { // 默认调试值,正常逻辑会被覆盖 DateTime dateTimeUtc = DateTime.Now.AddYears(-120); try { TimeZoneInfo est = TimeZoneInfo.FindSystemTimeZoneById("America/New_York"); // 明确指定输入时间的Kind为Unspecified,避免因Kind不匹配抛出异常 dateValue = DateTime.SpecifyKind(dateValue, DateTimeKind.Unspecified); // 自带夏令时处理,无需手动调整时间 dateTimeUtc = TimeZoneInfo.ConvertTimeToUtc(dateValue, est); // 如需调试夏令时状态,使用东部时区对象判断 bool isEasternDaylight = est.IsDaylightSavingTime(dateValue); _logger.LogDebug("IsDaylightSavingTime : {0}", isEasternDaylight); _logger.LogDebug("TimeZoneInfo Process : {0} Converted Time : {1}", est, dateTimeUtc); } catch (Exception ex) { _logger.LogError("TimeZoneInfo Process Error - " + ex.Message); } return dateTimeUtc; }
系统环境验证
执行以下命令更新Ubuntu的时区规则库,避免旧版本夏令时规则导致转换误差:
sudo apt update && sudo apt install -y tzdata
内容的提问来源于stack exchange,提问作者Duke
相关产品推荐
相关产品推荐

