.jpg)
DateTime和DateTimeOffset有什么区别,什么时候应该使用?DateTimeDateTimeOffset
目前,我们有一种以时区感知方式处理 .NET 的标准方法:每当我们生成 时,我们都使用 UTC 进行(例如使用 ),每当我们显示一个时,我们都会从 UTC 转换回用户的本地时间。DateTimeDateTimeDateTime.UtcNow
这工作正常,但我一直在阅读它如何在对象本身中捕获本地和 UTC 时间。DateTimeOffset

网友回答:
来自微软:
日期时间偏移量值的这些用法比日期时间值的用法更常见。因此,应将 DateTimeOffset 视为应用程序开发的默认日期和时间类型。
来源:“在日期时间、日期时间偏移量、时间跨度和时区信息之间进行选择”,MSDN
我们几乎使用所有内容,因为我们的应用程序处理特定的时间点(例如,创建/更新记录的时间)。作为旁注,我们也在SQL Server 2008中使用。DateTimeOffsetDATETIMEOFFSET
当您只想处理日期、仅时间或处理一般意义上的任何一个时,我认为这是有用的。例如,如果您有一个闹钟,您希望每天早上 7 点响起,您可以将其存储在 use a 中,因为您希望它在早上 7 点响起,而不管 DST 如何。但是,如果要表示警报发生的历史记录,则可以使用 。DateTimeDateTimeDateTimeKindUnspecifiedDateTimeOffset
混合使用类型时要小心,尤其是在分配和比较类型时。此外,仅比较相同的实例,因为在比较时会忽略时区偏移量。DateTimeOffsetDateTimeDateTimeDateTimeKindDateTime

网友回答:
DateTimeOffset是瞬时时间(也称为绝对时间)的表示形式。我的意思是,对每个人都有普遍性的时间时刻(不考虑闰秒或时间膨胀的相对论效应)。表示瞬时时间的另一种方法是使用 where is 。DateTime.KindDateTimeKind.Utc
这与日历时间(也称为民事时间)不同,日历时间是某人日历上的位置,全球有许多不同的日历。我们将这些日历称为时区。日历时间由 where is 或 表示。并且仅在您对使用结果的计算机的位置有隐含的了解的情况下才有意义。(例如,用户的工作站)DateTime.KindDateTimeKind.UnspecifiedDateTimeKind.Local.Local
那么,为什么而不是UTC?一切都与视角有关。让我们打个比方——我们会假装是摄影师。DateTimeOffsetDateTime
想象一下,你站在日历时间轴上,将相机对准摆在你面前的瞬时时间线上的人。您可以根据时区规则排列相机 – 由于夏令时或时区法律定义的其他更改,这些规则会定期更改。(你的手没有稳定的手,所以你的相机摇晃。
站在照片中的人会看到你的相机来自的角度。如果其他人在拍照,他们可能从不同的角度拍照。这就是部分所代表的。OffsetDateTimeOffset
因此,如果您将相机标记为“东部时间”,有时您从 -5 指向,有时您指向 -4。世界各地都有相机,它们都标有不同的东西,并且都从不同的角度指向同一瞬时时间线。其中一些彼此相邻(或重叠),因此仅知道偏移量不足以确定时间与哪个时区相关。
那么UTC呢?嗯,这是保证有稳定手的相机。它放在三脚架上,牢固地固定在地面上。它不会去任何地方。我们称其视角为零偏移。
那么——这个类比告诉我们什么?它提供了一些直观的准则-
DateTimeUnspecifiedLocalDateTime.NowDateTime.NowUnspecifiedDateTimeOffsetDateTimeDateTimeOffsetDateTimeOffset还应该指出的是,Noda Time 有一个为此调用的表示形式,而 .Net 基类库没有任何类似的东西。您需要同时存储 a 和值。ZonedDateTimeDateTimeOffsetTimeZoneInfo.Id以下是支持这个类比的其他一些小细节,以及一些保持直截了当的技巧:DateTimeOffset
DateTimeOffset2012-01-01T00:00:00+00:002012-01-01T02:00:00+02:00DateTimeOffset.Offset善良很重要。如果您传递 UTC 类型,它将以零偏移量进行,但如果您传递 or 或 ,它将假定为本地。框架基本上是说,“好吧,你让我将日历时间转换为瞬时时间,但我不知道这是从哪里来的,所以我只打算使用本地日历。如果您在具有不同时区的计算机上加载未指定的内容,这是一个巨大的陷阱。(恕我直言 – 这应该引发异常 – 但它没有。DateTimeDateTimeOffset.Local.UnspecifiedDateTime无耻的插头:
许多人与我分享说,他们发现这个类比非常有价值,所以我把它包含在我的 Pluralsight 课程《日期和时间基础》中。您将在第二个模块“上下文很重要”中找到相机类比的分步演练,该模块位于标题为“日历时间与瞬时时间”的剪辑中。

网友回答:
DateTime 只能存储两个不同的时间,即本地时间和 UTC。属性指示哪个。
DateTimeOffset 通过能够存储来自世界任何地方的本地时间来扩展这一点。它还存储该本地时间和 UTC 之间的偏移量。请注意,DateTime 无法执行此操作,除非您向类中添加一个额外的成员来存储该 UTC 偏移量。或者只使用 UTC。顺便说一句,这本身就是一个好主意。
模板简介:该模板名称为【DateTime和DateTimeOffset有什么区别,什么时候应该使用?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。