如何忽略时区将字符串转为DateTimeOffset并获取+00:00偏移量?
解决DateTimeOffset转换时区不符的问题
这个问题说白了就是你的扩展方法默认用了本地系统时区解析字符串,而你需要的是UTC时区(+00:00)的结果。下面给你几个实用的解决方案:
1. 直接指定UTC时区转换(最直接的解决办法)
修改你的扩展方法,在解析时显式指定使用UTC规则,这样不管本地时区是什么,结果都会是+00:00:
public static DateTimeOffset ConvertToDateTimeOffset(this string input) { // 使用AdjustToUniversal标记,强制解析为UTC时间 return DateTimeOffset.Parse(input, null, DateTimeStyles.AdjustToUniversal); // 或者另一种等价写法:先解析为DateTime,再手动指定UTC偏移量 // var parsedDateTime = DateTime.Parse(input); // return new DateTimeOffset(parsedDateTime, TimeSpan.Zero); }
调用"2010-05-10".ConvertToDateTimeOffset()后,就能得到你期望的{2010. 05. 10. 0:00:00 +00:00}了。
2. 给扩展方法加时区参数(更灵活的方案)
如果之后需要支持不同时区的转换,可以给方法加一个可选参数,默认用UTC:
public static DateTimeOffset ConvertToDateTimeOffset(this string input, TimeZoneInfo targetTimeZone = null) { // 不传时区的话默认用UTC targetTimeZone ??= TimeZoneInfo.Utc; var localDateTime = DateTime.Parse(input); // 将本地时间转换为目标时区的DateTimeOffset return TimeZoneInfo.ConvertTime(localDateTime, targetTimeZone); }
这样既满足当前UTC的需求,以后要转其他时区也不用改方法,直接传对应的TimeZoneInfo就行。
为什么会出现这个问题?
你之前的扩展方法应该是直接用了DateTimeOffset.Parse(input)或者类似无参数的转换方法——这些方法在处理不带时区信息的字符串时,会自动使用当前系统的本地时区来生成偏移量。比如你的系统处于UTC+2时区(比如中欧夏令时),转换后的结果就会带上+02:00的偏移,这就是和预期不符的原因。
内容的提问来源于stack exchange,提问作者pbarna
相关产品推荐
相关产品推荐

