C# NodaTime如何将ISO字符串解析为EST时区的ZonedDateTime格式
问题原因
你出现解析结果错误是两个核心问题导致的:
- 序列化与解析的格式串不匹配
- 序列化时你用的是小写偏移令牌
o<HH>,解析时误用了大写O<HH>,二者匹配规则不同,导致偏移量解析失败,默认使用了UTC+0偏移 - 序列化格式串中多写了多余的
+符号,o系列令牌本身会自带正负偏移符号,额外添加的+会和实际输出的-符号冲突,进一步导致解析错位 - 你原序列化代码中
new DateTime构造参数里多了一个多余的逗号,会导致编译错误,注意修正为new DateTime(2021, 2, 10, 7, 7, 7, DateTimeKind.Utc)
- 序列化时你用的是小写偏移令牌
- 偏移量与时区没有直接绑定关系:UTC-5的偏移可以对应多个时区,如果你需要固定返回纽约(EST/EDT)时区的
ZonedDateTime,需要额外指定时区转换规则。
解决方案
方案1:修正格式串直接解析(适用仅需要保留偏移的场景)
首先统一序列化和解析的格式串,完全匹配你输出的2021-02-10T02:07:07.000 -05格式:
// 序列化侧修正后的代码 var IsoString = zonedDateTime.Value.ToString("yyyy-MM-ddTHH:mm:ss.fff o<HH>", CultureInfo.InvariantCulture); // 解析侧代码 var parsePattern = ZonedDateTimePattern.CreateWithInvariantCulture("yyyy-MM-ddTHH:mm:ss.fff o<HH>", DateTimeZoneProviders.Tzdb); var result = parsePattern.Parse(yourIsoString).Value;
方案2:强制转换为纽约时区(适用要求固定EST/EDT时区的场景)
如果要避免偏移对应其他时区的歧义,推荐先把字符串解析为Instant(时间戳),再显式转换为纽约时区的ZonedDateTime:
// 先解析为UTC时间戳 var instantPattern = InstantPattern.CreateWithInvariantCulture("yyyy-MM-ddTHH:mm:ss.fff o<HH>"); var instant = instantPattern.Parse(yourIsoString).Value; // 转换为纽约时区的ZonedDateTime var estZonedDateTime = instant.InZone(DateTimeZoneProviders.Tzdb["America/New_York"]);
内容的提问来源于stack exchange,提问作者User
相关产品推荐
相关产品推荐

