当前位置:  开发笔记 > 编程语言 > 正文

DateTime.UtcNow应该有时区偏移吗?

如何解决《DateTime.UtcNow应该有时区偏移吗?》经验,为你挑选了1个好方法。

这个(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(时区偏移为零).

我错过了什么或这是一个错误吗?



1> Soner Gönül..:

我想结合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值,此格式说明符表示OffsetUTC 的DateTimeOffset值,以小时为单位.

DateTimeOffset.NowDateTimeOffset.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中,如果在调试模式下勾选了选项,则可能会出现异常.

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有