如果将UTC时间再通过ToString()方法的"z"/"zz"/"zzz"自定义格式说明符进行转化,就引发异常:
托管调试助手 "DateTimeInvalidLocalFormat":“正在将 UTC DateTime 转换为某种文本,这种文本的格式只对本地时间有效。在使用“z”格式说明符调用 DateTime.ToString 时,可能发生这种情况,因为它在输出中包含本地时区偏移量。在这种情况下,要么使用“Z”格式说明符(它指定 UTC 时间),要么使用“o”格式字符串,后者是以文本形式保留 DateTime 的推荐方式。在传递要由 XmlConvert 或 DataSet 序列化的 DateTime 时也可能发生这种情况。如果使用 XmlConvert.ToString,请在 XmlDateTimeSerializationMode.RoundtripKind 中传递以进行正确序列化。如果使用 DataSet,请在 DataColumn 对象上将 DateTimeMode 设置为 DataSetDateTime.Utc。 ”
错误代码演示以及错误信息截图:
不要看上面的说明一大堆,其实这是一个比较低级错误,就是把UTC时间再转换成UTC格式的时间(无意义转换),所以被认为是无效的时间格式!主要还是需要理解下UTC(世界统一时间)和zzz自定义格式说明符。
要想还原这个错误,可以新建一个控制台应用程序,输入下列代码:
DateTime dt = DateTime.Now.ToUniversalTime();
dt.ToString("yyyy-MM-ddTHH:mm:ssz");
//dt.ToString("yyyy-MM-ddTHH:mm:sszz");
//dt.ToString("yyyy-MM-ddTHH:mm:sszzz");
PS:注释的另外两行代码同样会引发DateTimeInvalidLocalFormat异常。估计还有其他情况也会引发这个异常,不过目前我还没遇到过。
关于异常中提到的“Z”格式说明符,看MSDN文档即可:"z"自定义格式说明符
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/99023.html