如何获取非本地时区夏令时信息并转换对应夏令时时区?
解决方案
你需要针对用户指定的时区而非本地时区来判断夏令时状态,以下是修正后的代码及关键说明:
修正后的代码
protected DateTime ConvertTimeZoneFromUTC(DateTime dateTime) { // 确保输入为UTC时间 var dateUtc = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc); // 获取用户指定的时区对象(避免重复调用FindSystemTimeZoneById) var userTimeZone = TimeZoneInfo.FindSystemTimeZoneById(WindowsTimeZoneName); // 直接转换UTC时间到用户时区,方法会自动处理夏令时偏移 var convertedTime = TimeZoneInfo.ConvertTimeFromUtc(dateUtc, userTimeZone); // 获取当前对应的时区名称(夏令时或标准时间) string currentTimeZoneName; if (userTimeZone.SupportsDaylightSavingTime && userTimeZone.IsDaylightSavingTime(convertedTime)) { currentTimeZoneName = userTimeZone.DaylightName; // 例如"US Mountain Daylight Time" } else { currentTimeZoneName = userTimeZone.StandardName; // 例如"US Mountain Standard Time" } // 注意:无需再次调用ConvertTimeFromUtc,因为convertedTime已经是正确的时间 // 如果仅需获取时区名称,使用currentTimeZoneName即可;如果需要返回转换后的时间,直接返回convertedTime return convertedTime; }
关键修正点
- 替换本地时区为用户时区:使用
userTimeZone.IsDaylightSavingTime()而非TimeZoneInfo.Local的方法,确保判断逻辑完全针对用户指定的时区。 - 避免重复转换:
TimeZoneInfo.ConvertTimeFromUtc会自动根据时区的夏令时规则调整时间偏移,无需单独使用夏令时ID重新转换(Windows时区的标准名和夏令时名称指向同一个时区对象,转换结果一致)。 - 兼容无夏令时时区:先检查
userTimeZone.SupportsDaylightSavingTime,避免对本身不支持夏令时的时区做无效判断。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

