首页 > C# > DateTime和DateTimeOffset有什么区别,什么时候应该使用?

DateTime和DateTimeOffset有什么区别,什么时候应该使用?

上一篇 下一篇

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.NowUnspecified
  • 如果您必须始终确定当下,请确保您代表的是瞬时时间。用于强制执行它,或按照约定使用 UTC。DateTimeOffsetDateTime
  • 如果您需要跟踪瞬时时刻,但还想知道“用户认为这是他们本地日历上的几点时间?”,那么您必须使用 .例如,这对于计时系统非常重要 – 无论是在技术还是法律方面。DateTimeOffset
  • 如果您需要修改以前记录的内容,则仅靠偏移量中没有足够的信息来确保新的偏移量仍然与用户相关。您还必须存储时区标识符(想想 – 我需要该相机的名称,以便即使位置已更改,我也可以拍摄新照片)。DateTimeOffset还应该指出的是,Noda Time 有一个为此调用的表示形式,而 .Net 基类库没有任何类似的东西。您需要同时存储 a 和值。ZonedDateTimeDateTimeOffsetTimeZoneInfo.Id
  • 有时,您会希望表示“正在查看它的人”的本地日历时间。例如,在定义今天的含义时。今天总是午夜到午夜,但这些代表了瞬时时间轴上近乎无限数量的重叠范围。(实际上,我们的时区数量有限,但您可以将偏移量表示为刻度)因此,在这些情况下,请确保您了解如何将“谁在问?”问题限制在一个时区,或者酌情将它们翻译回瞬时时间。

以下是支持这个类比的其他一些小细节,以及一些保持直截了当的技巧:DateTimeOffset

  • 如果比较两个值,则在比较之前先将它们规范化为零偏移。换句话说,和指相同的瞬时时刻,因此是等价的。DateTimeOffset2012-01-01T00:00:00+00:002012-01-01T02:00:00+02:00
  • 如果要执行任何单元测试,并且需要确定偏移量,请分别测试值和属性。DateTimeOffset.Offset
  • .Net 框架中内置了单向隐式转换,允许您将 传递给任何参数或变量。执行此操作时,.善良很重要。如果您传递 UTC 类型,它将以零偏移量进行,但如果您传递 or 或 ,它将假定为本地。框架基本上是说,“好吧,你让我将日历时间转换为瞬时时间,但我不知道这是从哪里来的,所以我只打算使用本地日历。如果您在具有不同时区的计算机上加载未指定的内容,这是一个巨大的陷阱。(恕我直言 – 这应该引发异常 – 但它没有。DateTimeDateTimeOffset.Local.UnspecifiedDateTime

无耻的插头:

许多人与我分享说,他们发现这个类比非常有价值,所以我把它包含在我的 Pluralsight 课程《日期和时间基础》中。您将在第二个模块“上下文很重要”中找到相机类比的分步演练,该模块位于标题为“日历时间与瞬时时间”的剪辑中。

分割线

网友回答:

DateTime 只能存储两个不同的时间,即本地时间和 UTC。属性指示哪个。

DateTimeOffset 通过能够存储来自世界任何地方的本地时间来扩展这一点。它还存储该本地时间和 UTC 之间的偏移量。请注意,DateTime 无法执行此操作,除非您向类中添加一个额外的成员来存储该 UTC 偏移量。或者只使用 UTC。顺便说一句,这本身就是一个好主意。

模板简介:该模板名称为【DateTime和DateTimeOffset有什么区别,什么时候应该使用?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 564次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 02-22
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
html5 微信模板 微信文章 响应式 企业网站 单页式简历模板 微信图片 自适应 微信素材 微信公众平台
您可能会喜欢的其他模板