博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DateTime还是DateTimeOffset?Now还是UtcNow?
阅读量:7247 次
发布时间:2019-06-29

本文共 1175 字,大约阅读时间需要 3 分钟。

(此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注。)

题记:新年第一篇文章,就来谈谈关于时间的简单技术问题:该用DateTime还是DateTimeOffset?该用Now还是UtcNow?

首先需要说明的是.NET中出现两个保存时间的数据结构是由于历史的原因。DateTime一开始就出现在.NET的基础类型中;为了解决DateTime中的一些缺陷,又保证代码能够兼容,就多出了一个DateTimeOffset。

DateTime只保存两部分信息:Ticks和Kind。一个Tick是100纳秒(1万Tick等于1毫秒),Ticks记录了从1/1/0001 12:00 AM到现在经过了多少100纳秒。Kind保存的是DateTimeKind枚举值,有Utc、Local和Unspecified 。Utc意味着Tick计数表示协调世界时间的数量,其不会受到夏令时或者时区的影响。Local表示本地时间的数量,会受到夏令时的影响。由于DateTime并不保存时区偏移,所以要获得真正的UTC时间,就会检查计算机当前的市区设置,那么ToUniversalTime和ToLocalTime方法都会进行这样的转换。Kind的第三种值Unspecified,意味着我们不知道到底是本地时间还是UTC时间。所以这种情况只能表示年月日,时间无法精确表示。

DateTime除了存在这个问题,还会在进行比较的时候,其不会考虑Kind是UTC还是Local,从而导致错误。DateTime在进行字符串化的时候,对于某些标准格式也会出现问题(根源还是时区的问题),比如ToString("u")的时候,会直接把Local当作UTC来处理。

为了解决上述时区和转换的问题,DateTimeOffset应运而生。它只保存Ticks,不保存Kind,且Ticks总是相对于UTC的值。

从官方文档给出的建议来看,我们总是应该使用DateTimeOffset,只有仅仅表示日期和不需要关心时区的时候才使用DateTime。

另外,在Stackoverflow上的这个回答,也很形象的描述了DateTimeOffset和DateTime的区别和优势。简而言之,DateTimeOffset是一种瞬时时间(即绝对时间),DateTime是一种历法时间(即钟表时间)。

最后,这两个数据类型都有Now和UtcNow两个方法。Now用于获取现在的时间,UtcNow获取Utc的现在时间。而实际上,Now内部是先调用UtcNow,然后进行转换得到。所以,在一般情况下,都应该使用UtcNow。

在文章结束的时候,给大家留个小问题,协调世界时间(Coordinated Universal Time)的简写为什么是UTC,而不是CUT?下次文章公布答案。

转载地址:http://mdnbm.baihongyu.com/

你可能感兴趣的文章
优先队列 C++
查看>>
Robot Framework - 1 - 测试用例与测试库
查看>>
Bootstrap Table的 文本内容 垂直居中
查看>>
[js项目]封装库-下拉菜单
查看>>
强数学归纳法
查看>>
解析函数论 Page 8 $\log (1+x)$的泰勒展开
查看>>
「陶哲軒實分析」 習題 3.5.5
查看>>
Java基础之 运算符
查看>>
Spring-boot:多模块打包
查看>>
Spring基础13——Spring表达式语言:SpEL
查看>>
MYSQL5.5安装教程
查看>>
C++程序设计(第2版)课后习题答案--第14章
查看>>
网络概念(二)
查看>>
NGUI的Tween动画的使用
查看>>
通过组策略实现IE自动以当前域账号登录某站点
查看>>
实验1成绩汇总
查看>>
数据持久化
查看>>
安装Apache遇到的一点问题
查看>>
Java画出验证码图片
查看>>
第一周的学习进度表
查看>>