如何使用z格式符解析DateTimeOffset 兼容单数字时区偏移格式
C# 解析多格式时区偏移为DateTimeOffset的解决方案
问题原因
.NET 中
z自定义格式符在用于ParseExact解析时,默认要求输入的小时部分为两位带前导零的格式(如+01),不支持单数字的+1格式,这是官方格式规范的固有规则。
解决方案
直接使用 DateTimeOffset.ParseExact 支持多格式数组的重载,预定义所有需要支持的偏移格式即可,不需要提前判断输入匹配的格式类型。其中单数字时区偏移需要用%z格式符,%为.NET自定义格式字符串的前缀,用于标识单个字符为自定义格式符,避免与标准格式字符串冲突。
可运行代码示例
using System.Globalization; // 封装统一的解析方法 DateTimeOffset ParseOffset(string input) { // 按需求定义所有支持的时区偏移格式 string[] allowedPatterns = new[] { "zzz", // 匹配 ±HH:mm 格式,例如 +05:00 "zz", // 匹配 ±HH 格式,例如 -05 "%z" // 匹配 ±H 单数字格式,例如 +5 }; return DateTimeOffset.ParseExact( input, allowedPatterns, CultureInfo.InvariantCulture, DateTimeStyles.None ); } // 测试逻辑 try { var testData = new string[] { "+01:10", "-01", "+1" }; foreach (var testInput in testData) { var result = ParseOffset(testInput); Console.WriteLine($"{testInput} 解析后的偏移分钟数:{result.Offset.TotalMinutes}"); } } catch (Exception ex) { Console.WriteLine($"解析失败:{ex.Message}"); }
输出结果
+01:10 解析后的偏移分钟数:70 -01 解析后的偏移分钟数:-60 +1 解析后的偏移分钟数:60
如果要保留原有传入pattern的写法,只需要将单数字场景的pattern修改为%z即可,示例测试用例修改为:
var testData = new (string input, string pattern)[3] { ("+01:10", "zzz"), ("-01", "zz"), ("+1", "%z") // 替换原有的"z"为"%z"即可正常运行 };
内容的提问来源于stack exchange,提问作者isxaker
相关产品推荐
相关产品推荐

