DateTimeInvalidLocalFormat发生了

7

我正在尝试根据UTC时间差获取本地日期时间,并执行以下代码。

 var dtString =DateTime.UtcNow.ToString(@"yyyy-MM-ddTHH\:mm\:ss.fzzz"); 

但是每次它都返回一个异常,如下图:

enter image description here

为什么会出现这个异常?如何解决这个问题?


3
你看过 https://msdn.microsoft.com/library/ms172213 吗? - Jeroen Mostert
1
这不是异常,只是调试器的警告。按F5继续。如果您不想看到它,请使用Debug > Exceptions > Managed Debugging Assistants >取消选中DateTimeInvalidLocalFormat选项。不要担心生成无意义的字符串,UTC日期当然没有UTC偏移量。 - Hans Passant
谢谢@HansPassant,我明白了,我太蠢了,没有考虑到UTC日期和偏移量。 - vijayp
2个回答

9
z格式说明符用于显示本地时间和UTC时间之间的偏移量。
在UTC时间中使用它没有意义(因为它总是0)。这就是为什么你会得到一个警告(感谢@HansPassant提供的提示)。
你可以选择:
想要打印本地时间和UTC偏移量(这是标准的):
var dtString = DateTime.Now.ToString(@"yyyy-MM-ddTHH\:mm\:ss.f zzz");

或者想要打印出UTC时间和本地时区(这真的非常不常见):

var dtString = DateTime.UtcNow.ToString(@"yyyy-MM-ddTHH\:mm\:ss.f") + " " + DateTime.Now.ToString(@"zzz"); 

这与你的代码几乎相同(正如@JeroenMostert在链接中解释的那样):

var dtString = DateTime.UtcNow.ToString(@"yyyy-MM-ddTHH\:mm\:ss.fzzz"); 

但是生成的字符串并不标准,会导致误解。
"2015-02-18T12:08:15.1 +01:00"

这里的“本地时间”和“本地时区”是指实际使用的时间和时区,而不是UTC时间和本地时区。

此外,您可以在TimeZone.CurrentTimeZone Property中找到更多关于时区的信息和好的例子。


-3

完整的消息文本可能会回答您的问题:

当使用“z”格式说明符调用DateTime.ToString时,输出将包括本地时区偏移量,从而可能导致此问题。在这种情况下,可以使用“Z”格式说明符指定UTC时间,或者使用“o”格式字符串,这是将DateTime持久化为文本的推荐方式。

您的格式字符串包含z说明符"yyyy-MM-ddTHH\:mm\:ss.fzzz"。请尝试将其更改为"yyyy-MM-ddTHH\:mm\:ss.fZZZ"


4
在字符串中,这只会产生“ZZZ”。该消息有点误导;“Z”并不是真正的格式说明符,而是在结尾处的单个“Z”(将原样传递)表示UTC时间。 - Jeroen Mostert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接