免费申请com网站,邢台网站开发,四川鼎能建设集团网站,h5制作平台是什么意思引言DateTime数据类型是一个复杂的问题#xff0c;复杂到足以让你在编写【将日期从Web服务器返回到浏览器】简单代码时感到困惑。ASP.NET MVC 5和 Web API 2/ASP.NETCore 以不同方式序列化日期#xff0c;这可能会给在一个Web应用程序中同时使用这两个序列化的开发人员带来更… 引言 DateTime数据类型是一个复杂的问题复杂到足以让你在编写【将日期从Web服务器返回到浏览器】简单代码时感到困惑。ASP.NET MVC 5和 Web API 2/ASP.NETCore 以不同方式序列化日期这可能会给在一个Web应用程序中同时使用这两个序列化的开发人员带来更多混淆。本文会尽量覆盖 ASP.NET / ASP.NETCore 中与 Date/Time有关的歧义、参数绑定、序列化相关的知识点和坑位。 Date/Time值歧义和应对策略 使用Datetime最大的问题在于歧义整个地球分为24个时区每个时区都有自己的本地时间例如一个DateTime值指示了本地时间这个值在同时区的其他系统依然标示了同一时间点 但是在其他时区以外这个DateTime值就会有各自的解释。电邮中若有Sun 04 June 2019 9:45:29 0800说明信件发送第时间是2019年6月04日星期日上午9点45分29秒该地区领先UTC8小时 (800就是东八区时间)。对于发这封邮件的时间北京本地时9点45伦敦是凌晨1点45 ...... 正因为这个现状在Internet以及无线电通信时时间的统一很重要。 业界提出了不同的格式来明确地表示单一时间点 Web开发行业提出了不同的解决方案以明确定义时间值。 UTC时间 在国际无线电通信中为避免各自为战而普遍使用一个标准时间称为协调世界时UTC UTC是0时区的时间值与格林威治标准时间GMT一样都与英国伦敦的当地时间相同 UTC能准确代表单一时间点UTC 时间对于住在加利福尼亚和中国的人来说都是一样的。 如果把以上北京时间2019/06/04 09:45:29转化为UTC时间可以使用以下公式 UTC 时区差 当地时间。因为北京时间是东8区所以这个点UTC时间是 2019/06/04 02:45:29也可认为该值是伦敦时间开发者可以考虑的解决方案 是 使用UTC时间存储date/time、服务端维护、计算也使用UT时间、将UTC时间发送到浏览器浏览器javascript在Web页上转化为当地时间。 ISO 8601 Web上有许多时间显示格式但最著名并大规模采用的是ISO-8601 标准。https://www.cl.cam.ac.uk/~mgk25/iso-time.html当没有更多信息的时候只包含Date/Time 的写法被假定为当地时间要指示该时间是UTC时间可在Datetime值后面加上字母 z在Datetime值后面增加 hh:mm、 hhmm, -hh 可指示该时间值相对于UTC时间的偏移.Net中关于Date/Time的实现 .Net 4.0 提供的各种结构已经全方位支持 date timezone timezone之间的转化足以解决开发者遇到的Date/Time相关的问题。DateTime DateTime 定义了一个特殊的date/time, 内置的Kind属性提供了受限的时区信息 ① DateTimeKind.UTC 指定了UTC的DateTime明确定义了单一时间点 ② DateTimeKind.Local 指示了本地时间这个值在具有相同时区的其他系统依然能够定义一个时间点但是在其他时区以外这个DateTime值会有不同解释。 ③ DateTimeKind.Unspecified 更没有兼容性仅表示时间值 我们关注 DateTime.ToUniversalTime() 方法的表现当DateTime被设定为Unspecified时候 ToUniversalTime会首先假定该值是 Local when to use datetime你只处理当地时间你没有跨越时区的计算你只处理 UTC时间处理抽象日期/时间使用 Unspecified例如跨国公司的跨时区门店都在早上9点开业DateTimeOffset表示时间点通常表示为一天中相对于UTC时间的日期/时间该结构体自然带有相对于UTC时间的偏移信息when to use DateTimeOffset代码需要应对不同时区的时间值时区之间相互转化需要进行跨时区的计算Date/Time 序列化 Web API2 和ASP.NET Core内置的JSON序列化器是Newtonsoft.JsonJSON.NET将日期时间序列化为ISO-8601格式Date valueserialized valueDateTime.Now (Pacific time)2016-10-11T19:25:34.8346658-07:00DateTime.UtcNow2016-10-12T01:25:34.8346658Znew DateTime(2016, 6, 6, 4, 5,5 )2016-06-06T04:05:05new DateTimeOffset(new DateTime(2016, 6, 6, 4, 5,5 ), new TimeSpan(-2, 0,0))2016-06-06T04:05:05-02:00 ASP.NET MVC 5内置的JSON Serializer 还是System.Web.Script.Serialization.JavaScriptSerializer 该序列化器将date序列化为时间戳“\/Date(ticks)\/” ticks 表示从1970-1-1 00:00:00 UTCUnix Epoch经历的毫秒数这样的格式在客户端需要使用JavaScript做一些本地转化 转化后的值无法体现时区。 JavaScriptSerializer还有更多缺点现在社区鼓励使用Json.Net 序列化器。Date/Time字符串转换 在开发中常涉及Date/Time 参数绑定和字符串转换 当中也有一些坑位需要规避。一个时间日期字符串 若没有相对于UTC的偏移信息转换后的DateTime对象的DateTimKind是Unspecified若指定了offset转换后的DateTime对象的DateTimeKind是Local 并且时间值被调整到机器的当地时间。最近我们生产环境WebSite再迁移到k8s集群 (UTC时间)之后就遇到这样的问题:订单转储的预期是北京时间2019-05-11---2019-05-12实际情况是在网站端转换为Unspecified 而进一步ToUniversalTime()过滤的时候该时间段又被假定是机器的当地时间 也就是说查询时间段变成了 伦敦时间2019-05-11---2019-05-12这样自然与预期不符。解决思路 添加偏移信息告知明确的时间段 2019-05-11 00:00:0008:00 ---- 2019-05-12 00:00:0008:00开发者每天都在使用的Date/Time有很多学问 涉及Culture、Calendar、夏令时 这里只是浅谈最常用的知识点和坑位。原文地址https://www.cnblogs.com/JulianHuang/p/10967289.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com