日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

你需要了解的有关.NET日期时间的必要信息

發(fā)布時(shí)間:2023/12/4 asp.net 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你需要了解的有关.NET日期时间的必要信息 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引言

 ? ?DateTime數(shù)據(jù)類型是一個(gè)復(fù)雜的問題,復(fù)雜到足以讓你在編寫【將日期從Web服務(wù)器返回到瀏覽器】簡單代碼時(shí)感到困惑。

ASP.NET MVC 5和 Web API 2/ASP.NETCore 以不同方式序列化日期,這可能會(huì)給在一個(gè)Web應(yīng)用程序中同時(shí)使用這兩個(gè)序列化的開發(fā)人員帶來更多混淆。

本文會(huì)盡量覆蓋 ASP.NET / ASP.NETCore 中與 Date/Time有關(guān)的歧義、參數(shù)綁定、序列化相關(guān)的知識點(diǎn)和坑位。?

Date/Time值歧義和應(yīng)對策略

  使用Datetime最大的問題在于歧義,整個(gè)地球分為24個(gè)時(shí)區(qū),每個(gè)時(shí)區(qū)都有自己的本地時(shí)間

例如一個(gè)DateTime值指示了本地時(shí)間,這個(gè)值在同時(shí)區(qū)的其他系統(tǒng)依然標(biāo)示了同一時(shí)間點(diǎn); 但是在其他時(shí)區(qū)以外,這個(gè)DateTime值就會(huì)有各自的解釋。

電郵中若有

Sun , 04, June 2019 9:45:29 +0800

說明信件發(fā)送第時(shí)間是2019年6月04日,星期日,上午9點(diǎn)45分29秒,該地區(qū)領(lǐng)先UTC8小時(shí) (+800,就是東八區(qū)時(shí)間)。

對于發(fā)這封郵件的時(shí)間,北京本地時(shí)9點(diǎn)45,倫敦是凌晨1點(diǎn)45 ......

  正因?yàn)檫@個(gè)現(xiàn)狀,在Internet以及無線電通信時(shí),時(shí)間的統(tǒng)一很重要。

  業(yè)界提出了不同的格式來明確地表示單一時(shí)間點(diǎn), Web開發(fā)行業(yè)提出了不同的解決方案以明確定義時(shí)間值。

??UTC時(shí)間

  在國際無線電通信中,為避免各自為戰(zhàn)而普遍使用一個(gè)標(biāo)準(zhǔn)時(shí)間,稱為協(xié)調(diào)世界時(shí)(UTC)

?UTC是0時(shí)區(qū)的時(shí)間值,與格林威治標(biāo)準(zhǔn)時(shí)間(GMT)一樣,都與英國倫敦的當(dāng)?shù)貢r(shí)間相同

  UTC能準(zhǔn)確代表單一時(shí)間點(diǎn),UTC 時(shí)間對于住在加利福尼亞和中國的人來說都是一樣的。

?如果把以上北京時(shí)間2019/06/04 09:45:29轉(zhuǎn)化為UTC時(shí)間,可以使用以下公式: UTC + 時(shí)區(qū)差 = 當(dāng)?shù)貢r(shí)間。

因?yàn)楸本r(shí)間是東8區(qū),所以這個(gè)點(diǎn)UTC時(shí)間是 2019/06/04 02:45:29(也可認(rèn)為該值是倫敦時(shí)間)

開發(fā)者可以考慮的解決方案 是: 使用UTC時(shí)間存儲(chǔ)date/time、服務(wù)端維護(hù)、計(jì)算也使用UT時(shí)間、將UTC時(shí)間發(fā)送到瀏覽器,瀏覽器javascript在Web頁上轉(zhuǎn)化為當(dāng)?shù)貢r(shí)間。

?ISO 8601

  Web上有許多時(shí)間顯示格式,但最著名并大規(guī)模采用的是ISO-8601 標(biāo)準(zhǔn)。https://www.cl.cam.ac.uk/~mgk25/iso-time.html

當(dāng)沒有更多信息的時(shí)候,只包含Date/Time 的寫法被假定為當(dāng)?shù)貢r(shí)間,要指示該時(shí)間是UTC時(shí)間,可在Datetime值后面加上字母?z

在Datetime值后面增加 +hh:mm、 +hhmm, -hh 可指示該時(shí)間值相對于UTC時(shí)間的偏移

.Net中關(guān)于Date/Time的實(shí)現(xiàn)

  .Net 4.0+ 提供的各種結(jié)構(gòu)已經(jīng)全方位支持 date, timezone, timezone之間的轉(zhuǎn)化,足以解決開發(fā)者遇到的Date/Time相關(guān)的問題。

DateTime

  DateTime 定義了一個(gè)特殊的date/time, 內(nèi)置的Kind屬性提供了受限的時(shí)區(qū)信息

  ① DateTimeKind.UTC 指定了UTC的DateTime,明確定義了單一時(shí)間點(diǎn)

  ② DateTimeKind.Local 指示了本地時(shí)間,這個(gè)值在具有相同時(shí)區(qū)的其他系統(tǒng)依然能夠定義一個(gè)時(shí)間點(diǎn),但是在其他時(shí)區(qū)以外,這個(gè)DateTime值會(huì)有不同解釋。

  ③ DateTimeKind.Unspecified 更沒有兼容性,僅表示時(shí)間值

  我們關(guān)注 DateTime.ToUniversalTime() 方法的表現(xiàn),當(dāng)DateTime被設(shè)定為Unspecified時(shí)候, ToUniversalTime會(huì)首先假定該值是 Local



?when to use datetime?

  • 你只處理當(dāng)?shù)貢r(shí)間,你沒有跨越時(shí)區(qū)的計(jì)算

  • 你只處理 UTC時(shí)間

  • 處理抽象日期/時(shí)間(使用 Unspecified):例如跨國公司的跨時(shí)區(qū)門店都在早上9點(diǎn)開業(yè)

DateTimeOffset

表示時(shí)間點(diǎn),通常表示為一天中相對于UTC時(shí)間的日期/時(shí)間,該結(jié)構(gòu)體自然帶有相對于UTC時(shí)間的偏移信息

when to use DateTimeOffset?

  • 代碼需要應(yīng)對不同時(shí)區(qū)的時(shí)間值

  • 時(shí)區(qū)之間相互轉(zhuǎn)化

  • 需要進(jìn)行跨時(shí)區(qū)的計(jì)算

Date/Time 序列化

  Web API2 和ASP.NET Core內(nèi)置的JSON序列化器是Newtonsoft.Json,JSON.NET將日期時(shí)間序列化為ISO-8601格式:

Date value

serialized value

DateTime.Now (Pacific time)

2016-10-11T19:25:34.8346658-07:00

DateTime.UtcNow

2016-10-12T01:25:34.8346658Z

new DateTime(2016, 6, 6, 4, 5,5 )

2016-06-06T04:05:05

new 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內(nèi)置的

JSON Serializer?

還是System.Web.Script.Serialization.JavaScriptSerializer, 該序列化器將date序列化為時(shí)間戳:“\/Date(ticks)\/”, ticks 表示從1970-1-1 00:00:00 UTC(Unix Epoch)經(jīng)歷的毫秒數(shù),

這樣的格式在客戶端需要使用JavaScript做一些本地轉(zhuǎn)化, 轉(zhuǎn)化后的值無法體現(xiàn)時(shí)區(qū)。?


JavaScriptSerializer還有更多缺點(diǎn),現(xiàn)在社區(qū)鼓勵(lì)使用Json.Net 序列化器。

Date/Time字符串轉(zhuǎn)換

  在開發(fā)中,常涉及Date/Time 參數(shù)綁定和字符串轉(zhuǎn)換, 當(dāng)中也有一些坑位需要規(guī)避。

一個(gè)時(shí)間日期字符串, 若沒有相對于UTC的偏移信息,轉(zhuǎn)換后的DateTime對象的DateTimKind是Unspecified;

若指定了offset,轉(zhuǎn)換后的DateTime對象的DateTimeKind是Local, 并且時(shí)間值被調(diào)整到機(jī)器的當(dāng)?shù)貢r(shí)間。

最近我們生產(chǎn)環(huán)境WebSite再遷移到k8s集群 (UTC時(shí)間)之后,就遇到這樣的問題:

訂單轉(zhuǎn)儲(chǔ)的預(yù)期是:北京時(shí)間2019-05-11--->2019-05-12

實(shí)際情況是在網(wǎng)站端轉(zhuǎn)換為Unspecified, 而進(jìn)一步ToUniversalTime()過濾的時(shí)候,該時(shí)間段又被假定是機(jī)器的當(dāng)?shù)貢r(shí)間, 也就是說查詢時(shí)間段變成了: 倫敦時(shí)間2019-05-11--->2019-05-12

這樣自然與預(yù)期不符。

解決思路: 添加偏移信息,告知明確的時(shí)間段: 2019-05-11 00:00:00+08:00 ----> 2019-05-12 00:00:00+08:00

開發(fā)者每天都在使用的Date/Time有很多學(xué)問, 涉及Culture、Calendar、夏令時(shí), 這里只是淺談最常用的知識點(diǎn)和坑位。

原文地址:https://www.cnblogs.com/JulianHuang/p/10967289.html

.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?

總結(jié)

以上是生活随笔為你收集整理的你需要了解的有关.NET日期时间的必要信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。