如何将DateTimeOffset转换为指定时区的午夜时间
实现方案
实现逻辑分三步:
- 先把传入的
DateTimeOffset转换为目标时区对应的本地时间 - 截断时间部分,得到目标时区当日零点的
DateTime - 计算该零点在目标时区对应的UTC偏移,组装为最终的
DateTimeOffset返回
完整扩展方法代码
public static DateTimeOffset AtMidnightInTimeZone(this DateTimeOffset date, TimeZoneInfo timeZone) { // 转换为目标时区的时间 DateTime targetZoneLocalTime = TimeZoneInfo.ConvertTime(date, timeZone); // 截断到当日零点 DateTime targetZoneMidnight = targetZoneLocalTime.Date; // 获取该零点在目标时区的正确UTC偏移 TimeSpan correctOffset = timeZone.GetUtcOffset(targetZoneMidnight); // 返回最终结果 return new DateTimeOffset(targetZoneMidnight, correctOffset); }
说明
上述代码可以直接通过你提供的单元测试,同时兼容夏令时切换等特殊时区场景:如果遇到目标时区当日不存在零点的极端情况(比如部分时区夏令时切换日,零点直接跳转为1点),TimeZoneInfo.GetUtcOffset会自动适配合法的时间偏移,无需额外处理异常。
内容的提问来源于stack exchange,提问作者dhrm
相关产品推荐
相关产品推荐

