.Net中TimeZoneInfo.ConvertTime转换UTC到萨摩亚时区返回错误值求助
问题描述
使用以下代码将UTC时间x转换为萨摩亚标准时间时:
var finalValue = TimeZoneInfo.ConvertTime(x, timeZoneInfo).ToString(format);
实际得到的结果偏移了14小时(显示为04:14:39),但timeZoneInfo.BaseUtcOffset显示的基础偏移是13小时,预期结果应为03:14:39,且该方法在其他时区转换正常。
原因分析
萨摩亚标准时间(Samoa Standard Time)的时区规则包含夏令时调整:
- 基础偏移(BaseUtcOffset)为UTC+13(标准时间)
- 夏令时生效时,偏移会调整为UTC+14
TimeZoneInfo.ConvertTime方法会自动检测目标时间是否处于夏令时时段,并应用对应的实际偏移,而非仅使用BaseUtcOffset的基础值。你转换的时间刚好处于萨摩亚的夏令时生效区间内,因此得到了UTC+14的偏移结果。
解决方法
如果你的需求是强制使用萨摩亚的标准时间(不考虑夏令时),而非当前生效的时区时间,可以直接基于基础偏移手动计算:
// 直接添加基础偏移,忽略夏令时 var standardTime = x.Add(timeZoneInfo.BaseUtcOffset); var finalValue = standardTime.ToString(format);
如果需要确认夏令时是否生效,可以通过以下代码判断:
bool isDaylightSaving = timeZoneInfo.IsDaylightSavingTime(x);
内容的提问来源于stack exchange,提问作者Tiago Silva
相关产品推荐
相关产品推荐

