如何构造特定时区的DateTimeOffset实例?
解决方案
你可以借助.NET中的TimeZoneInfo类自动处理时区偏移(包括夏令时变化),无需手动计算TimeSpan参数,具体实现步骤如下:
通过时区ID获取对应时区对象
使用TimeZoneInfo.FindSystemTimeZoneById方法,传入目标时区ID(比如"Pacific Standard Time")即可获取时区实例。创建待转换的时间(注意指定时间类型)
由于你明确知道该时间属于目标时区,需将DateTime的Kind设为Unspecified,避免系统误判成本地时区或UTC时间。生成
DateTimeOffset实例
有两种简洁的实现方式:- 方式一:先获取对应时间的偏移量,再传入
DateTimeOffset构造函数; - 方式二:直接调用转换方法一步得到结果,更高效。
- 方式一:先获取对应时间的偏移量,再传入
代码示例
方式一:分步获取偏移量构造
// 获取太平洋时区实例 TimeZoneInfo pacificTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); // 创建目标时间(指定Kind为Unspecified) DateTime targetDateTime = new DateTime(2023, 5, 7, 15, 0, 0, DateTimeKind.Unspecified); // 自动获取该时间在目标时区的UTC偏移量(含夏令时处理) TimeSpan offset = pacificTimeZone.GetUtcOffset(targetDateTime); // 构造DateTimeOffset实例 DateTimeOffset myTime = new DateTimeOffset(targetDateTime, offset);
方式二:一步转换(推荐)
TimeZoneInfo pacificTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); DateTimeOffset myTime = TimeZoneInfo.ConvertTime( new DateTime(2023, 5, 7, 15, 0, 0, DateTimeKind.Unspecified), pacificTimeZone );
关键说明
TimeZoneInfo.GetUtcOffset会根据传入的具体日期时间,自动判断时区是否处于夏令时,返回正确的偏移量,无需手动调整;- 必须将
DateTime的Kind设为Unspecified,若设为Local或Utc,系统会基于当前本地时区或UTC进行转换,导致结果错误。
内容的提问来源于stack exchange,提问作者Franky
相关产品推荐
相关产品推荐

