这个(LINQPad代码段):
DateTime.Now.ToString("yyyy-MM-ddTHH:mm:sszzz").Dump(); DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:sszzz").Dump();
返回:
2016-01-08T09:05:04-07:00 // Expected 2016-01-08T16:05:04-07:00 // Not what I expected
鉴于第二个结果是通用时间,我预计它会返回2016-01-08T16:05:04-00:00
(时区偏移为零).
我错过了什么或这是一个错误吗?
我想结合Gusman和Evan的评论,如果他们允许我,就会反对他们.让我们一步一步走..
应该
DateTime.UtcNow
有时区偏移吗?
无论Kind
它具有什么(Local,Utc或Unspecified),DateTime
实例都不保留任何 UTC偏移值.期.
首先,让我们来看看该"zzz"
格式说明文件;
使用DateTime值,"zzz"自定义格式说明符表示本地操作系统的时区与UTC的签名偏移量,以小时和分钟为单位.它不反映实例的DateTime.Kind属性的值.因此,建议不要将"zzz"格式说明符与DateTime值一起使用.
基于前两个粗体句子,LINQPad生成的结果都是完全可以预期的.您也可以在Visual Studio中获得相同的结果(预计课程的日期和时间部分).
只需将此代码作为"无需调试启动"(Ctrl+ F5)运行
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-ddTHH:mm:sszzz")); Console.WriteLine(DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:sszzz"));
但是,当你用(F5)开始运行它时,开始调试呢?
在这种情况下,有两个选项取决于您DateTimeInvalidLocalFormat
的托管调试助手是否勾选.此部分位于Debug
菜单上,然后单击Exceptions
.
如果选中此选项,则会出现例外情况并且表示;
一个
UTC
日期时间正在转换的格式只对本地时间正确的文本.DateTime.ToString
使用'z'
格式说明符调用时会发生这种情况 ,格式说明符将在输出中包含本地时区偏移量.在这种情况下,要么使用'Z'
指定UTC时间的格式说明符,要么使用'o'
格式字符串,这是在文本中保留DateTime的推荐方法.
如果未勾选此选项,则不会收到任何消息,结果将与LINQPad相同.
鉴于第二个结果是通用时间,我预计它会返回
2016-01-08T16:05:04-00:00
(时区偏移为零).
正如我所解释的,zzz
格式说明并没有那样做的任何 DateTime
实例.
但对于DateTimeOffset
记录为的实例,它的行为有所不同;
对于
DateTimeOffset
值,此格式说明符表示Offset
UTC 的DateTimeOffset值,以小时为单位.
而DateTimeOffset.Now
和DateTimeOffset.UtcNow
是完全符合您的期望,无论你在LINQPad或Visual Studio中运行,因为它们被记录为;
现在
DateTimeOffset对象,其日期和时间是当前本地时间,其偏移量是本地时区与协调世界时(UTC)的偏移量.
UtcNow
日期和时间为当前协调世界时(UTC)且其偏移量为的对象
TimeSpan.Zero
.
Console.WriteLine(DateTimeOffset.Now.ToString("yyyy-MM-ddTHH:mm:sszzz")); Console.WriteLine(DateTimeOffset.UtcNow.ToString("yyyy-MM-ddTHH:mm:sszzz"));
会产生
2016-01-08T09:05:04-07:00 2016-01-08T16:05:04-00:00
Tl; dr我认为这不是一个bug.LINQPad产生正确的结果究竟应该是什么.在Visual Studio中,如果在调试模式下勾选了该选项,则可能会出现异常.