狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

到了2038年時間戳溢出了怎么辦?

freeflydom
2024年2月14日 8:33 本文熱度 595

計(jì)算機(jī)中的時間

看完這篇文章相信你會對計(jì)算機(jī)中的時間有更系統(tǒng)全面的認(rèn)識。

我經(jīng)常自嘲,自己寫的程序運(yùn)行不超過3年,因?yàn)榇蟛糠猪?xiàng)目方就早早跑路了。大多數(shù)項(xiàng)目上線后,你跟這個項(xiàng)目就再無瓜葛,關(guān)于時間你只需要保證時區(qū)正確就不會有太大問題,哈哈。 但是今天我想認(rèn)真對待時間這個問題,作為一個庫作者或基礎(chǔ)軟件作者,就需要考慮下游項(xiàng)目萬一因?yàn)槟闾幚頃r間不當(dāng)而造成困擾,影響范圍就比較廣了。

計(jì)算機(jī)中與時間有關(guān)的關(guān)鍵詞:

時間類型

時間戳(timestamp)

定時器(例如js中setInterval())

時間計(jì)算

時間段

超時(setTimeout())

時間片

GMT

UTC

Unix時間戳

ISO8601

CST

EST

看到這些你可能會疑惑,為何一個時間竟然如此復(fù)雜!!

如果下面的問題你都能答上來,那這篇文章對你的幫助微乎其微,不如做些更有意義的事情。

  • 常用的時間格式,他們都遵循哪些標(biāo)準(zhǔn)?

  • 什么是GMT?

  • 什么是UTC?

  • GMT UTC 和ISO8601有什么區(qū)別?

  • RFC5322是什么?

  • RFC5322 采用的是GMT還是UTC?

  • ISO8601 使用的是UTC還是GMT?

  • 在ISO8601中 Z可以使用+00:00表示嗎?

  • UTC什么時候校準(zhǔn)?

  • CST是東八區(qū)嗎?

  • Z是ISO 8601規(guī)定的嗎,為什么是Z?

  • 時區(qū)劃分是哪個標(biāo)準(zhǔn)定義的?

  • 為什么是1970年1月1日呢?

  • 到了2038年時間戳溢出了怎么辦?

  • 計(jì)算機(jī)中時間的本質(zhì)是一個long類型嗎?

  • WEB前后端用哪個格式傳輸好?

  • '2024-01-01T24:00:00' 等于 '2024-01-02T00:00:00' ??\


正文開始

1. 兩種時間標(biāo)準(zhǔn)

UTC和GMT都是時間標(biāo)準(zhǔn),定義事件的精度。它們只表示 零時區(qū) 的時間,本地時間則需要與 時區(qū) 或偏移 結(jié)合后表示。這兩個標(biāo)準(zhǔn)之間差距通常不會超過一秒。

UTC(協(xié)調(diào)世界時)

UTC,即協(xié)調(diào)世界時(Coordinated Universal Time),是一種基于原子鐘的時間標(biāo)準(zhǔn)。它的校準(zhǔn)是根據(jù)地球自轉(zhuǎn)的變化而進(jìn)行的,插入或刪除閏秒的實(shí)際需求在短期內(nèi)是難以預(yù)測的,因此這個決定通常是在需要校準(zhǔn)的時候發(fā)布。 閏秒通常由國際電信聯(lián)盟(ITU) 和國際度量衡局(BIPM) 等組織進(jìn)行發(fā)布。由國際原子時(International Atomic Time,TAI) 通過閏秒 的調(diào)整來保持與地球自轉(zhuǎn)的同步。

GMT(格林尼治標(biāo)準(zhǔn)時間)

以英國倫敦附近的格林尼治天文臺(0度經(jīng)線,本初子午線)的時間為基準(zhǔn)。使用地球自轉(zhuǎn)的平均速度來測量時間,是一種相對于太陽的平均時刻。盡管 GMT 仍然被廣泛使用,但現(xiàn)代科學(xué)和國際標(biāo)準(zhǔn)更傾向于使用UTC。

2. 兩種顯示標(biāo)準(zhǔn)

上面我們討論的時間標(biāo)準(zhǔn)主要保證的是時間的精度,時間顯示標(biāo)準(zhǔn)指的是時間的字符串表示格式。我們熟知的有 RFC 5322 和 ISO 8601。

RFC 5322 電子郵件消息格式的規(guī)范

RFC 5322 的最新版本是在2008年10月在IETF發(fā)布的,你閱讀時可能有了更新的版本。

RFC 5322 是一份由 Internet Engineering Task Force (IETF) 制定的標(biāo)準(zhǔn),定義了 Internet 上的電子郵件消息的格式規(guī)范。該標(biāo)準(zhǔn)于2008年發(fā)布,是對之前的 RFC 2822 的更新和擴(kuò)展。雖然 RFC 5322 主要關(guān)注電子郵件消息的格式,但其中的某些規(guī)范,比如日期時間格式,也被其他領(lǐng)域采納,例如在 HTTP 協(xié)議中用作日期頭部(Date Header)的表示。

格式通常如下:

Thu, 14 Dec 2023 05:36:56 GMT

時區(qū)部分為了可讀可以如下表示:

Thu, 14 Dec 2023 05:36:56 CST

Thu, 14 Dec 2023 05:36:56 +0800

Thu, 14 Dec 2023 05:36:56 +0000

Thu, 14 Dec 2023 05:36:56 Z

但并不是所有程序都兼容這種時區(qū)格式,通常程序會忽略時區(qū),在寫程序時要做好測試。標(biāo)準(zhǔn)沒有定義毫秒數(shù)如何顯示。

需要注意的是,有時候我們會見到這種格式Tue Jan 19 2038 11:14:07 GMT+0800 (中國標(biāo)準(zhǔn)時間),這是js日期對象轉(zhuǎn)字符串的格式,它與標(biāo)準(zhǔn)無關(guān),千萬不要混淆了。

ISO 8601

ISO 8601 最新版本是 ISO 8601:2019,發(fā)布日期為2019年11月15日,你閱讀時可能有了更新的版本。

下面列舉一些格式示例:

2004-05-03T17:30:08+08:00

2004-05-03T17:30:08+00:00

2004-05-03T17:30:08Z

2004-05-03T17:30:08.000+08:00

標(biāo)準(zhǔn)并沒有定義小數(shù)位數(shù),保險(xiǎn)起見秒后面一般是3位小數(shù)用來表示毫秒數(shù)。 字母 "Z" 是 "zero"(零)的縮寫,因此它被用來表示零時區(qū),也可以使用+00:00,但Z更直觀且簡潔。

  1. 本標(biāo)準(zhǔn)提供兩種方法來表示時間:一種是只有數(shù)字的基礎(chǔ)格式;第二種是添加了分隔符的擴(kuò)展格式,更易讀。擴(kuò)展格式使用連字符“-”來分隔日期,使用冒號“:”來分隔時間。比如2009年1月6日在擴(kuò)展格式中可以寫成"2009-01-06",在基本格式中可以簡單地寫成"20090106"而不會產(chǎn)生歧義。 若要表示前1年之前或9999年之后的年份,標(biāo)準(zhǔn)也允許有共識的雙方擴(kuò)展表達(dá)方式。雙方應(yīng)事先規(guī)定增加的位數(shù),并且年份前必須有正號“+”或負(fù)號“-”而不使用“。依據(jù)標(biāo)準(zhǔn),若年份帶符號,則前1年為"+0000",前2年為"-0001",依此類推。

  2. 午夜,一日的開始:完全表示為000000或00:00:00;僅有小時和分表示為0000或00:00

  3. 午夜,一日的終止:完全表示為240000或24:00:00;僅有小時和分表示為2400或24:00

  4. 如果時間在零時區(qū),并恰好與UTC相同,那么在時間最后加一個大寫字母Z。Z是相對協(xié)調(diào)世界時時間0偏移的代號。 如下午2點(diǎn)30分5秒表示為14:30:05Z或143005Z;只表示小時和分,為1430Z或14:30Z;只表示小時,則為14Z或14Z。

  5. 其它時區(qū)用實(shí)際時間加時差表示,當(dāng)時的UTC+8時間表示為22:30:05+08:00或223005+0800,也可以簡化成223005+08。

日期與時間合并表示時,要在時間前面加一大寫字母T,如要表示東八區(qū)時間2004年5月3日下午5點(diǎn)30分8秒,可以寫成2004-05-03T17:30:08+08:00或20040503T173008+08。

在編寫API時推薦使用ISO 8601標(biāo)準(zhǔn)接收參數(shù)或響應(yīng)結(jié)果,并且做好時區(qū)測試,因?yàn)椴煌幊陶Z言中實(shí)現(xiàn)可能有差異。

時區(qū)劃分和偏移

全球被分為24個時區(qū),每個時區(qū)對應(yīng)一個小時的時間差。 時區(qū)劃分由IANA維護(hù)和管理,其時區(qū)數(shù)據(jù)庫被稱為 TZ Database(或 Olson Database)。這個數(shù)據(jù)庫包含了全球各個時區(qū)的信息,包括時區(qū)的名稱、標(biāo)識符、以及歷史性的時區(qū)變更數(shù)據(jù),例如夏令時的開始和結(jié)束時間等。在許多操作系統(tǒng)(如Linux、Unix、macOS等)和編程語言(如Java、Python等)中得到廣泛應(yīng)用。

TZ Database具體見我整理的表格,是從Postgresql中導(dǎo)出的一份Excel,關(guān)注公眾號"程序飼養(yǎng)員",回復(fù)"tz"

時區(qū)標(biāo)識符采用"洲名/城市名"的命名規(guī)范,例如:"America/New_York"或"Asia/Shanghai"。這種命名方式旨在更準(zhǔn)確地反映時區(qū)的地理位置。時區(qū)的具體規(guī)定和管理可能因國家、地區(qū)、或國際組織而異。

有一些時區(qū)是按照半小時或15分鐘的間隔進(jìn)行偏移的,以適應(yīng)地理和政治需求。在某些地區(qū),特別是位于邊界上的地區(qū),也可能采用不同的時區(qū)規(guī)則。

EST,CST、GMT(另外一個含義是格林尼治標(biāo)準(zhǔn)時間)這些都是時區(qū)的縮寫。

這種簡寫存在重復(fù),如CST 可能有多種不同的含義,China Standard Time(中國標(biāo)準(zhǔn)時間),它對應(yīng)于 UTC+8,即東八區(qū)。Central Standard Time(中部標(biāo)準(zhǔn)時間) 在美國中部標(biāo)準(zhǔn)時間的縮寫中也有用。中部標(biāo)準(zhǔn)時間對應(yīng)于 UTC-6,即西六區(qū)。因此在某些軟件配置時不要使用簡稱,一定要使用全稱,如”Asia/Shanghai“。

采用東八區(qū)的國家和地區(qū)有哪些

  • 中國: 中國標(biāo)準(zhǔn)時間(China Standard Time,CST)是東八區(qū)的時區(qū),對應(yīng)于UTC+8。

  • 中國香港: 中國香港也采用東八區(qū)的時區(qū),對應(yīng)于UTC+8。

  • 中國澳門: 澳門也在東八區(qū),使用UTC+8。

  • 中國臺灣: 臺灣同樣在東八區(qū),使用UTC+8。

  • 新加坡: 新加坡位于東八區(qū),使用UTC+8。

  • 馬來西亞: 馬來西亞的半島部分和東馬來西亞位于東八區(qū),使用UTC+8。

  • 菲律賓: 菲律賓采用東八區(qū)的時區(qū),對應(yīng)于UTC+8。

計(jì)算機(jī)系統(tǒng)中的時間 —— Unix時間戳

Unix時間戳(Unix timestamp)定義為從1970年01月01日00時00分00秒(UTC)起至現(xiàn)在經(jīng)過的總秒數(shù)(秒是毫秒、微妙、納秒的總稱)。

這個時間點(diǎn)通常被稱為 "Epoch" 或 "Unix Epoch"。時間戳是一個整數(shù),表示從 Epoch 開始經(jīng)過的秒數(shù)。

一些關(guān)鍵概念:

  1. 起始時間點(diǎn): Unix 時間戳的起始時間是 1970 年 1 月 1 日 00:00:00 UTC。在這一刻,Unix 時間戳為 0。

  2. 增量單位: Unix 時間戳以秒為單位遞增。每過一秒,時間戳的值增加 1。

  3. 正負(fù)值: 時間戳可以是正值或負(fù)值。正值表示從 Epoch 開始經(jīng)過的秒數(shù),而負(fù)值表示 Epoch 之前的秒數(shù)。

  4. 精度: 通常情況下,Unix 時間戳以整數(shù)形式表示秒數(shù)。有時也會使用浮點(diǎn)數(shù)表示秒的小數(shù)部分,以提供更精細(xì)的時間分辨率。精確到秒是10位;有些編程語言精確到毫秒是13位,被稱為毫秒時間戳。

為什么是1970年1月1日?

這個選擇主要是出于歷史和技術(shù)的考慮。

Unix 操作系統(tǒng)的設(shè)計(jì)者之一,肯·湯普森(Ken Thompson)和丹尼斯·里奇(Dennis Ritchie)在開發(fā) Unix 操作系統(tǒng)時,需要選擇一個固定的起始點(diǎn)來表示時間。1970-01-01 00:00:00 UTC 被選為起始時間。這個設(shè)計(jì)的簡潔性和通用性使得 Unix 時間戳成為計(jì)算機(jī)系統(tǒng)中廣泛使用的標(biāo)準(zhǔn)方式來表示和處理時間。

時間戳為什么只能表示到2038年01月19日03時14分07秒?

在許多系統(tǒng)中,結(jié)構(gòu)體time_t 被定義為 long,具體實(shí)現(xiàn)取決于編譯器和操作系統(tǒng)的架構(gòu)。例如,在32位系統(tǒng)上,time_t 可能是32位的 long,而在64位系統(tǒng)上,它可能是64位的 long。 32位有符號long類型,實(shí)際表示整數(shù)只有31位,最大能表示十進(jìn)制2147483647(01111111 11111111 11111111 11111111)。

> new Date(2147483647000)

< Tue Jan 19 2038 11:14:07 GMT+0800 (中國標(biāo)準(zhǔn)時間)

實(shí)際上到2038年01月19日03時14分07秒,便會到達(dá)最大時間,過了這個時間點(diǎn),所有32位操作系統(tǒng)時間便會變?yōu)?0000000 00000000 00000000 00000000。因具體實(shí)現(xiàn)不同,有可能會是1901年12月13日20時45分52秒,這樣便會出現(xiàn)時間回歸的現(xiàn)象,很多軟件便會運(yùn)行異常了。

至于時間回歸的現(xiàn)象相信隨著64位操作系統(tǒng)的產(chǎn)生逐漸得到解決,因?yàn)橛?4位操作系統(tǒng)可以表示到292,277,026,596年12月4日15時30分08秒。

另外,考慮時區(qū)因素,北京時間的時間戳的起始時間是1970-01-01T08:00:00+08:00。


作者:程序飼養(yǎng)員
鏈接:https://juejin.cn/post/7312640704404111387
來源:稀土掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。




該文章在 2024/2/19 11:46:17 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved