XmlSerializer反序列化带时区的time类型未适配本地时区问题咨询
你的预期其实是正确的(但要注意几个细节)
首先直接给结论:你的预期没错——当你处于GMT+1时区时,格式为00:00:00.0000000+01:00的时间字符串,用XmlSerializer.Deserialize反序列化后,应该得到本地时间的00:00。
为什么这个预期是对的?
XmlSerializer对带时区偏移的时间字符串有明确的处理逻辑:
- 当XML中的时间包含时区标记(比如
+01:00),它会自动将这个时间转换为本地时区的DateTime对象,并且把该对象的Kind属性设置为DateTimeKind.Local。 - 你给出的字符串
00:00:00.0000000+01:00本身就代表GMT+1时区的零点,而你的本地时区正好是GMT+1,所以反序列化后的本地时间自然就是00:00,对应的UTC时间则是前一天的23:00。
可能让你误以为预期错误的几个坑
如果实际测试结果和预期不符,大概率是以下情况:
- 你不小心把DateTime转成UTC输出了
比如代码里调用了yourDateTime.ToUniversalTime(),这时候输出的就是UTC时间23:00,但这不是解析错误,是你转换了时间的显示基准。 - 系统时区设置不是GMT+1
检查下你的电脑时区是否真的是GMT+1,如果时区不对,解析后的本地时间自然会偏差。 - XML时间格式不完整
你给出的示例只有时间部分,实际XML里的时间通常需要包含日期(比如2024-05-20T00:00:00.0000000+01:00),缺失日期可能导致解析异常或行为不符合预期。
补全你的测试代码参考
这里给你补全测试代码,你可以直接运行验证:
using System; using System.IO; using System.Xml.Serialization; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Testing { // 定义测试用的模型类 public class TimeModel { public DateTime TargetTime { get; set; } } [TestClass] public class FooTest { [TestMethod] public void TestTimeDeserialization() { // 完整的XML内容,包含日期和时区偏移 var xmlContent = "<TimeModel><TargetTime>2024-05-20T00:00:00.0000000+01:00</TargetTime></TimeModel>"; var serializer = new XmlSerializer(typeof(TimeModel)); using (var stringReader = new StringReader(xmlContent)) { var resultModel = (TimeModel)serializer.Deserialize(stringReader); // 断言本地时间的时分秒都是0 Assert.AreEqual(0, resultModel.TargetTime.Hour); Assert.AreEqual(0, resultModel.TargetTime.Minute); // 验证Kind属性是Local,说明已经适配了本地时区 Assert.AreEqual(DateTimeKind.Local, resultModel.TargetTime.Kind); } } } }
内容的提问来源于stack exchange,提问作者Anders Lindén
相关产品推荐
相关产品推荐

