深度揭秘(代碼time)代碼修改時(shí)間怎么改,代碼中的時(shí)間,nx500打印機(jī)驅(qū)動(dòng),
目錄:
1.更改時(shí)間代碼
2.代碼時(shí)間格式
3.一鍵更改修改時(shí)間和日期代碼
4.代碼時(shí)間超限怎么辦
5.顯示時(shí)間代碼
6.代碼時(shí)間轉(zhuǎn)換
7.更改時(shí)間指令
8.代碼時(shí)間怎么設(shè)置
9.日期時(shí)間代碼
10.調(diào)整代碼
1.更改時(shí)間代碼
在國(guó)際化應(yīng)用中,對(duì)日期/時(shí)間的處理遠(yuǎn)比你想象中的更難,特別是當(dāng)涉及到時(shí)區(qū)的時(shí)候?yàn)槭裁磿?huì)這么難?我們?cè)撊绾谓鉀Q它?請(qǐng)聽我為你一一解析幾乎所有的系統(tǒng)都離不開“時(shí)間”的概念,以至于大多數(shù)語言(及其默認(rèn)庫(kù))都定義了日期/時(shí)間等類型。
2.代碼時(shí)間格式
但是,我們?nèi)粘Kf的“時(shí)間”這個(gè)詞實(shí)際上包含了多個(gè)相似卻有微妙差異的概念如果不能分清它們,會(huì)給你的開發(fā)工作帶來很多煩惱基本概念時(shí)區(qū)(Timezone)在應(yīng)用濃綠的拼音怎么寫系統(tǒng)中,對(duì)時(shí)間的混淆往往和時(shí)區(qū)有關(guān)這是很多系統(tǒng)從本地化應(yīng)用發(fā)展成全球化應(yīng)用時(shí)的一大障礙。
3.一鍵更改修改時(shí)間和日期代碼
由于各地日出日落的時(shí)刻不同,所以全球一共分為 24 個(gè)時(shí)區(qū),每個(gè)時(shí)區(qū)橫跨 360/24=15 個(gè)經(jīng)度比如倫敦位于北京的西面,那么當(dāng)北京的太陽(yáng)已經(jīng)升起的時(shí)候,倫敦還要再過 8 小時(shí)才能迎來黎明也就是說,倫敦比北京晚 8 小時(shí)。
4.代碼時(shí)間超限怎么辦
而東京位于北京的東面,所以東京的日出比北京早 1 小時(shí)如果我們想知道當(dāng)北京是中午 12:00 的時(shí)候,東京是什么時(shí)間,可以先用 12:00 減去當(dāng)前時(shí)區(qū) +08:00,換算成倫敦時(shí)間 04:00,再加上目標(biāo)時(shí)區(qū) +09:00,就得到了東濃綠的拼音怎么寫京時(shí)間 13:00。
5.顯示時(shí)間代碼
零時(shí)區(qū)地球是圓的,北京比倫敦早8小時(shí)其實(shí)就等于比倫敦晚16小時(shí),到底誰比誰早呢?我們既可以把這個(gè)時(shí)差表示為+8,也可以表示為-16,到底該怎么寫呢?我們要先確定一個(gè)標(biāo)準(zhǔn)首先,要確定一個(gè)零時(shí)區(qū)雖然任何一個(gè)地方都可以作為零時(shí)區(qū),但擁有世界上第一座航海鐘的英國(guó)格林威治天文臺(tái)奪得了這項(xiàng)殊榮,而經(jīng)過那里的子午線(經(jīng)線),被稱為本初子午線。
6.代碼時(shí)間轉(zhuǎn)換
它左右各7.5度的范圍叫做零時(shí)區(qū),再往西一個(gè)時(shí)區(qū)就叫做西一區(qū)當(dāng)我們自東往西旅行的時(shí)候,是在追著太陽(yáng)走,因此每過一個(gè)時(shí)區(qū),就要把表?yè)苈粋€(gè)小時(shí)才能跟當(dāng)?shù)貢r(shí)間保持一致,我們把這個(gè)“撥慢”的動(dòng)作,記作 -01:00,反之則是濃綠的拼音怎么寫 +01:00。
7.更改時(shí)間指令
如果從倫敦往北京走,需要從西往東走八個(gè)時(shí)區(qū),因此北京的時(shí)區(qū)就記作 +08:00日界線(國(guó)際日期變更線)在球面上,與它相對(duì)的那條子午線,正好是 +12:00 區(qū)和 -12:00 區(qū)的分界線這條線很特殊,因?yàn)楫?dāng)你自西向東越過它的時(shí)候,既是比倫敦早了13小時(shí),從另一個(gè)方向來看,也是比倫敦晚了11小時(shí)。
8.代碼時(shí)間怎么設(shè)置
就像數(shù)學(xué)中的進(jìn)位一樣,它們的日期應(yīng)該是不同的當(dāng)自西向東越過日界線的時(shí)候(迎著朝陽(yáng)),日期應(yīng)該減一,反之(追趕夕陽(yáng)),則應(yīng)該加一假設(shè)有一個(gè)人于中午 12:00 坐飛機(jī)從倫敦出發(fā),自東向西(追著太陽(yáng))做環(huán)球旅行。
9.日期時(shí)間代碼
以這架飛機(jī)的速度,恰好每小時(shí)濃綠的拼音怎么寫飛過一個(gè)時(shí)區(qū),于是,每過一個(gè)小時(shí),他都要把表?yè)苈粋€(gè)小時(shí)(-01:00)換句話說,我們的主人公一直生活在中午 12:00,而太陽(yáng)也確實(shí)一直在他的頭頂,他的感知時(shí)間和表上的時(shí)間是一致的,這樣就避免了他頂著大太陽(yáng)說“現(xiàn)在是午夜”的荒謬感。
10.調(diào)整代碼
但是,當(dāng)他到達(dá)日界線的時(shí)候,還要做另一件事由于他是在自東向西穿越日界線,所以他還要把日期加一他繼續(xù)向前,等回到倫敦走下飛機(jī)的時(shí)候,他表上的時(shí)間是第二天中午 12:00,而當(dāng)?shù)貢r(shí)間也恰好是第二天的 12:00,他自己恰好在天上飛了一整天。
這樣,所有的時(shí)間就都對(duì)上了但是如果我們仔細(xì)看時(shí)區(qū)表,就會(huì)發(fā)現(xiàn)有些時(shí)區(qū)被標(biāo)記為+13:00、+14:00,這是怎么回事濃綠的拼音怎么寫呢?還是因?yàn)槿战缇€因?yàn)殡m然日界線大部分位于海上,但還是會(huì)穿過有人生活的陸地如果把同一個(gè)地方的人劃分到不同的日期,會(huì)帶來很多不便,于是日界線在中間拐了幾個(gè)彎,而這些拐彎的地方,自然就出現(xiàn)了像 +13:00、+14:00 這樣的怪異時(shí)區(qū)。
夏時(shí)制一到夏天,白天就變得很長(zhǎng),特別是高緯度地區(qū)會(huì)更明顯,到了北極或南極,太陽(yáng)整天都不會(huì)落下去,這就是極晝?yōu)榱顺浞掷么笞匀坏酿佡?zèng),有些地方會(huì)實(shí)行夏時(shí)制,也就是說到了夏天,就人為把表?yè)芸煲粋€(gè)小時(shí),讓人們?cè)琰c(diǎn)起床、早點(diǎn)睡覺,這樣可以節(jié)省一些照明的電費(fèi)。
中國(guó)曾經(jīng)短暫實(shí)行過幾年夏時(shí)制,不過后來認(rèn)為它帶來的負(fù)面影響超過收益,就取消了但是世界上仍然有很多地方實(shí)施夏時(shí)制,當(dāng)設(shè)濃綠的拼音怎么寫計(jì)全球化應(yīng)用的時(shí)候,必須得考慮它時(shí)刻(Instant)也許你意識(shí)到了,當(dāng)倫敦是中午十二點(diǎn)時(shí)(太陽(yáng)正當(dāng)空),位于倫敦西面的巴黎應(yīng)該是下午一點(diǎn)(太陽(yáng)略偏西)。
但實(shí)際上它們指的是一定是同一個(gè)時(shí)間想象一下,如果我中午十二點(diǎn)從倫敦給巴黎的朋友打一個(gè)電話,他接電話時(shí)手機(jī)上顯示的應(yīng)該是下午一點(diǎn)但無論是倫敦的中午十二點(diǎn),還是巴黎的下午一點(diǎn),都只是同一個(gè)客觀時(shí)間的兩種不同表示而已。
這個(gè)與時(shí)區(qū)無關(guān)的客觀時(shí)間,我們稱之為“時(shí)刻”事實(shí)上,在大部分場(chǎng)景下,我們應(yīng)該關(guān)注的都是這個(gè)時(shí)刻,而其它的時(shí)間,全都作為它的衍生物或等價(jià)物用這種客觀時(shí)刻作為記錄時(shí)唯一的一種時(shí)間,可以避免很多的概念混淆GMT —— 格林威治標(biāo)準(zhǔn)時(shí)間
自從確濃綠的拼音怎么寫定了時(shí)區(qū)之后,國(guó)際上就把格林威治時(shí)間記作 GMT+0對(duì)于同一個(gè)時(shí)刻,可以有 12:00 GMT+00:00、13:00 GMT+01:00 等多種等價(jià)的表示形式UTC —— 協(xié)調(diào)世界時(shí)現(xiàn)代科技對(duì)時(shí)間精度的要求越來越高,GMT 依靠天文觀測(cè)(地球自轉(zhuǎn))得來的時(shí)間已經(jīng)遠(yuǎn)遠(yuǎn)不能滿足現(xiàn)代科技的精度要求。
于是人們改用原子鐘來實(shí)現(xiàn)高精度計(jì)時(shí),但是 GMT 已經(jīng)有了很多歷史應(yīng)用,直接把它替換成原子鐘計(jì)時(shí)會(huì)帶來一些不兼容問題所以,人們創(chuàng)建了 UTC 時(shí)間,以便在新應(yīng)用中代替 GMT由于 UTC 不再依靠天文觀測(cè)來獲取,所以地球自轉(zhuǎn)一天的時(shí)間也不再一定等于 86400 秒。
如果地球自轉(zhuǎn)稍微慢了一丟丟呢?那一天的濃綠的拼音怎么寫最后一分鐘可能就有 61 秒,這叫做閏秒事實(shí)上,由于潮汐作用,地球的自轉(zhuǎn)確實(shí)一直在微不可查地減速所以,如果在某些系統(tǒng)中看到 23:59:60 這樣的表示法,請(qǐng)不要急著喊 BUG,先看看當(dāng)時(shí)的新聞上有沒有發(fā)過閏秒公告。
當(dāng)然,為了減少不必要的換算,UTC 在設(shè)計(jì)的時(shí)候刻意向 GMT 看齊,在絕大部分場(chǎng)景下,兩者沒有值得注意的差別日歷我們時(shí)常提到日期,但實(shí)際上并沒有一個(gè)叫做日期的獨(dú)立概念所有的日期,其實(shí)都是在某個(gè)日歷系統(tǒng)中的日期。
比如說我們既可以用“1911 年 10 月 10 日”表示發(fā)生辛亥革命的日期,也可以用“宣統(tǒng)三年八月十九”表示這兩個(gè)都對(duì)所以,當(dāng)我們要把一個(gè)時(shí)間顯示給用戶的時(shí)候,其日期部分濃綠的拼音怎么寫必須指定一個(gè)日歷才能正確地格式化。
我們?nèi)粘J褂玫哪J(rèn)日歷系統(tǒng),都是指格里高利日歷系統(tǒng),由于采納它的國(guó)家最多,因此也被稱為公歷而中國(guó)的傳統(tǒng)歷法叫做農(nóng)歷或陰歷類似的,還有伊斯蘭歷和佛教歷等日歷系統(tǒng)而年、月、日、星期等,也都是與特定日歷系統(tǒng)緊密相關(guān)的概念。
所以,一旦遇到“下個(gè)月”、“第 2 周”這樣的概念,先要明白它是指公歷系統(tǒng)中的一些語言或其默認(rèn)庫(kù)中把日期的概念綁死在了公歷系統(tǒng)上,比如 Java 的 Date 類,這會(huì)導(dǎo)致它在國(guó)際化時(shí)難以適應(yīng)不同的日歷系統(tǒng),容易引起混淆。
所以 Date 類的一些方法和屬性被棄用,并在 Java 8 中引入了一些新的時(shí)間/日期類時(shí)間的表示格式無論使用哪種時(shí)間/日期系濃綠的拼音怎么寫統(tǒng),也無論它們寫成什么格式,背后所代表的都是時(shí)刻這點(diǎn)差異非常重要,如果混淆了它們,在設(shè)計(jì)國(guó)際化應(yīng)用時(shí),就會(huì)陷入歧義。
Unix 時(shí)間戳(Time stamp)當(dāng) Unix 系統(tǒng)誕生的時(shí)候,需要一種數(shù)據(jù)結(jié)構(gòu)來表示時(shí)間,在計(jì)算機(jī)系統(tǒng)資源非常有限的條件下,系統(tǒng)的設(shè)計(jì)師選擇使用 32 位整數(shù)來表示時(shí)間,并以 UTC 時(shí)間的 1970年1月1日0時(shí)0分0秒 作為起點(diǎn)。
隨著 Unix 和 Linux 系統(tǒng)的廣泛流行,這種表示法的使用范圍也越來越廣然而,由于它是 32 位整數(shù),因此它最多只能表示到 2038 年初不過,在新系統(tǒng)中,已經(jīng)改用 64 位整數(shù)表示時(shí)間戳,它可以表示到2900億年之后,相當(dāng)于不存在最大濃綠的拼音怎么寫時(shí)間限制了。
但考慮到存在很多遺留系統(tǒng),這種遷移將是一個(gè)巨大的工程除了兼容性問題之外,Unix 時(shí)間戳在調(diào)試、追蹤方面也很不友好,你很難一眼看出它是什么時(shí)間,所以,在 API 和日志中盡量不要再用這種格式傳輸或存儲(chǔ)時(shí)間數(shù)據(jù)。
RFC2822在互聯(lián)網(wǎng)協(xié)議中傳輸?shù)淖址?,通常?RFC2822 格式的比如 Thu, 10 Dec 2020 13:49:45 GMT這種形式雖然冗長(zhǎng),但不存在精度限制,所以在一些對(duì)存儲(chǔ)空間不很敏感、但注重可讀性的場(chǎng)合卻很合適。
不過,這種格式涉及一點(diǎn)英語,這對(duì)非英語國(guó)家的人不太友好因此雖然對(duì)開發(fā)和調(diào)試的影響不大,但在國(guó)際化應(yīng)用中最好不要把它直接顯示給最終用戶ISO8601 濃綠的拼音怎么寫/ RFC3339另一種常用的字符串表示法是 ISO8601 格式,比如 2020-12-01T00:49:45.001Z。
ISO8601 包含很多種子格式事實(shí)上,中國(guó)使用的日期格式標(biāo)準(zhǔn)就是 ISO8601,但我們?nèi)粘V饕褂闷洹澳?月-日”部分從名字就可以看出,它是一個(gè) ISO 標(biāo)準(zhǔn),幾乎所有的現(xiàn)代語言和庫(kù)都能很好地支持它,不會(huì)造成歧義。
而且,它只會(huì)使用阿拉伯?dāng)?shù)字和兩個(gè)字母,以及幾個(gè)可選的分隔符,對(duì)于非英語用戶比較友好在互聯(lián)網(wǎng)領(lǐng)域,定義了另一個(gè)與 ISO8601 基本兼容的標(biāo)準(zhǔn) RFC3339,也就是“{年}-{月}-{日}T{時(shí)}:{分}:{秒}.{毫秒}{時(shí)區(qū)}”格式,其中的年要用零補(bǔ)齊濃綠的拼音怎么寫為4位,月日時(shí)分秒則補(bǔ)齊為2位。
毫秒部分是可選的最后一部分是時(shí)區(qū),前面例子中的 Z 其實(shí)是零時(shí)區(qū) Zulu 的縮寫,它也可能是 +08:00 或 -08:00 等這兩個(gè)標(biāo)準(zhǔn)非常相似,但又不完全兼容,在編程語境下常用的 ISO8601,指的是一個(gè)像 RFC3339 一樣五臟俱全的子版本。
也就是前面舉例過的 2020-12-01T00:49:45.001Z 這種形式人類可讀格式(Human-readable)雖然我們已經(jīng)有了很多種存儲(chǔ)格式,但人類用戶的需求是多樣的,比如有時(shí)候用戶只希望看到“月-日”或時(shí)間中的其它部分,甚至還有“剛剛、五分鐘前、上月”等“人類友好格式”,這些信息顯然是不全的,而且很濃綠的拼音怎么寫不規(guī)范,無法作為存儲(chǔ)格式使用。
他們存在的意義,就在于供人類閱讀還有另一種容易混淆的人類可讀格式,比如 2020-12-01 00:49:45.001,為什么說它是人類可讀格式而不是 ISO8601 呢?問題的關(guān)鍵不在于它少一個(gè) T,而在于它丟了時(shí)區(qū)信息!這樣一來,當(dāng)我把這個(gè)時(shí)間給一位倫敦同學(xué)看的時(shí)候,我們默認(rèn)都會(huì)把它當(dāng)做本地時(shí)間,看似一樣,但實(shí)際的時(shí)刻差了足足八小時(shí),什么事都耽誤了!
與時(shí)間有關(guān)的編程要點(diǎn)只存儲(chǔ)時(shí)刻Unix 時(shí)間戳、RFC2822 和 ISO8601 存儲(chǔ)的都是時(shí)刻,而人類可讀格式卻非如此,因?yàn)樗ǔ?huì)缺少至關(guān)重要的時(shí)區(qū)信息所以,不要在數(shù)據(jù)庫(kù)中存儲(chǔ)人類可讀格式,而應(yīng)該存儲(chǔ)時(shí)刻,否濃綠的拼音怎么寫則會(huì)丟失信息。
只有在把時(shí)間顯示給人類的時(shí)候,才應(yīng)該臨時(shí)轉(zhuǎn)換成人類可讀格式只傳輸時(shí)刻在 API 中,我們只應(yīng)該傳輸時(shí)刻因?yàn)?API 的提供者和消費(fèi)者很可能不在同一個(gè)時(shí)區(qū),如果傳輸缺少時(shí)區(qū)的人類可讀格式,就會(huì)被解釋為各自時(shí)區(qū)的時(shí)間,從而帶來歧義。
正確設(shè)置服務(wù)器時(shí)刻在服務(wù)器的內(nèi)部,存儲(chǔ)時(shí)刻通常使用 Unix 時(shí)間戳,這意味著它是 UTC 時(shí)刻當(dāng)你要在服務(wù)器上設(shè)置時(shí)間的時(shí)候,通常會(huì)輸入本地時(shí)間,并且由服務(wù)器內(nèi)部換算為時(shí)刻后生效這就要求服務(wù)器上必須正確設(shè)置了你輸入的本地時(shí)間所對(duì)應(yīng)的時(shí)區(qū),否則換算時(shí)就會(huì)出錯(cuò),讓服務(wù)器所理解的時(shí)刻不同于你期望的時(shí)刻,從而導(dǎo)致錯(cuò)誤。
如果你使用遠(yuǎn)程登錄的方式去管理服務(wù)器,可以把濃綠的拼音怎么寫當(dāng)前會(huì)話的時(shí)區(qū)臨時(shí)設(shè)置為你所在的時(shí)區(qū),這樣你就可以自由輸入本地時(shí)間了,服務(wù)器會(huì)自動(dòng)幫你換算當(dāng)然,如果你要以另一個(gè)時(shí)區(qū)的用戶身份在服務(wù)器上查詢,也可以把當(dāng)前會(huì)話的時(shí)區(qū)設(shè)置為該用戶的時(shí)區(qū),這樣你就可以自由使用該用戶期望的時(shí)間了。
也可以采用另一種方案:把服務(wù)器設(shè)置為零時(shí)區(qū),并且每次會(huì)話時(shí)不再設(shè)置時(shí)區(qū)這樣可以防止遺忘,但你就要自己把本地時(shí)間換算到零時(shí)區(qū)時(shí)間才能在服務(wù)器上輸入了比如你要查詢北京時(shí)間今天 00:0012:00 的日志,當(dāng)在服務(wù)器上做維護(hù)的時(shí)候就要換算成服務(wù)器上(零時(shí)區(qū))的時(shí)間也就是昨天16:00今天4:00。
這兩種方案各有利弊,但無論采用哪種方案,都要記住時(shí)區(qū)只是表象,真實(shí)時(shí)刻才是根本必須濃綠的拼音怎么寫確保所有服務(wù)器上的真實(shí)時(shí)刻保持一致,這樣才會(huì)記錄一個(gè)唯一的“真相”,以保持?jǐn)?shù)據(jù)的一致性比如,如果服務(wù)器設(shè)置為零時(shí)區(qū),輸入的時(shí)間時(shí)卻是你的本地時(shí)間,顯然會(huì)導(dǎo)致錯(cuò)誤。
讓各個(gè)節(jié)點(diǎn)的真實(shí)時(shí)刻保持一致并不容易不過好在互聯(lián)網(wǎng)建立之初就設(shè)計(jì)了一個(gè)協(xié)議:網(wǎng)絡(luò)時(shí)間協(xié)議 NTP它可以幫助各個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)自動(dòng)同步其真實(shí)時(shí)刻,在互聯(lián)網(wǎng)上大部分區(qū)域,其同步精度可以達(dá)到 1~50 毫秒最好讓上下游服務(wù)器的時(shí)區(qū)保持一致
無論采用哪種方案,都最好確保上下游服務(wù)器之間的時(shí)區(qū)保持一致,特別是應(yīng)用服務(wù)器與相應(yīng)的數(shù)據(jù)庫(kù)服務(wù)器比如應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器如果分別設(shè)置成了本地時(shí)區(qū)和零時(shí)區(qū),并且在應(yīng)用服務(wù)器上發(fā)送一條 SQL,以查詢 2020-濃綠的拼音怎么寫01-01 和 2020-01-02 之間的數(shù)據(jù),那么這個(gè)時(shí)刻到底指的是什么呢?應(yīng)用服務(wù)器以為它在查本地時(shí)區(qū)的,而數(shù)據(jù)庫(kù)服務(wù)器以為它要查零時(shí)區(qū)的,這顯然是錯(cuò)誤的。
在保存數(shù)據(jù)的時(shí)候,這種問題更嚴(yán)重如果一個(gè)表中某些時(shí)間字段是由應(yīng)用服務(wù)器填寫的,而另一些字段是由數(shù)據(jù)庫(kù)服務(wù)器填寫的,那么這種時(shí)區(qū)設(shè)置方面的差異就可能帶來災(zāi)難性的錯(cuò)誤為了防范這種問題,最簡(jiǎn)單的辦法是讓這些服務(wù)器的時(shí)區(qū)保持一致。
如果無法保持一致該怎么辦呢?這就要涉及接下來的幾個(gè)要點(diǎn)了不要使用“日期”剛才提到的問題,其表面問題在時(shí)區(qū),本質(zhì)問題卻在于“日期”這兩個(gè)日期有什么問題呢?問題就在于它沒有自帶時(shí)區(qū)信息!所以,應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器之間濃綠的拼音怎么寫,將無法就時(shí)區(qū)達(dá)成一致!各類信息丟失問題是很多 BUG 的根源,這里同樣如此。
更嚴(yán)重的是,它還丟失了時(shí)間信息既然我要傳的是“日期”,為什么還需要帶時(shí)間信息呢?很簡(jiǎn)單,因?yàn)闆]有所謂“日期”!我們?nèi)粘Kf的今天,其實(shí)是個(gè)時(shí)間段,指的是本時(shí)區(qū)今天 00:00:00 到明天 00:00:00 之間。
如果換個(gè)時(shí)區(qū),今天可能就不是今天了,而是從昨天 16:00:00 到 今天 16:00:00當(dāng)你說的今天指的到底是哪一天呢?所以,雖然和用戶交互時(shí),我們會(huì)使用日期的概念,但是在真正的程序中,我們應(yīng)該始終使用時(shí)刻,這樣才能保持概念一致性。
保存時(shí)使用來自應(yīng)用服務(wù)器的時(shí)刻雖然可以讓數(shù)據(jù)庫(kù)服務(wù)器和應(yīng)用服務(wù)器保持一致濃綠的拼音怎么寫,但為了簡(jiǎn)化邏輯,保存數(shù)據(jù)時(shí),盡量由應(yīng)用服務(wù)器來提供時(shí)刻,而不要由數(shù)據(jù)庫(kù)服務(wù)器提供,這樣可以簡(jiǎn)化時(shí)刻的來源,更容易保持一致性而對(duì)于客戶端提供的時(shí)間,我們無法信任,因?yàn)榭蛻舳斯?jié)點(diǎn)通常不在我們的控制范圍內(nèi),使用客戶端數(shù)據(jù)會(huì)帶來數(shù)據(jù)錯(cuò)誤,甚至帶來安全漏洞。
所以,對(duì)于需要保存的數(shù)據(jù),把應(yīng)用服務(wù)器上的時(shí)刻作為真相之源通常是最佳選擇查詢時(shí)使用來自用戶的時(shí)刻查詢通常是來自用戶視角的,比如當(dāng)用戶在北京查詢今天的數(shù)據(jù)時(shí),他一般是希望查詢北京時(shí)間今天 00:00:00 到明天 00:00:00 之間的數(shù)據(jù),而不會(huì)關(guān)心服務(wù)器在哪里。
所以,如果我們要設(shè)計(jì)一個(gè)查詢今天數(shù)據(jù)的 API,那么就不能把一個(gè)日期傳給應(yīng)用服務(wù)器,濃綠的拼音怎么寫因?yàn)榭蛻舳撕头?wù)端的時(shí)區(qū)可能不同,服務(wù)端就無法準(zhǔn)確理解客戶端的意圖我們應(yīng)該傳給它兩個(gè)參數(shù):本時(shí)區(qū)今天的起始時(shí)刻和結(jié)束時(shí)刻。
使用“閉-開”區(qū)間表示時(shí)間段當(dāng)我們用時(shí)間段來表示日期的時(shí)候,需要注意區(qū)間的右側(cè)應(yīng)該是開區(qū)間,也就是說,查詢要今天的數(shù)據(jù)就要查詢今天午夜零點(diǎn)到明天午夜零點(diǎn)之間的數(shù)據(jù),但不包含明天午夜的零點(diǎn)否則即使我們用 11:59:59.999 來查詢,仍然可能存在一條今天的數(shù)據(jù)出現(xiàn)在這個(gè)時(shí)間點(diǎn)之后。
用 SQL 在查數(shù)據(jù)庫(kù)時(shí)有一個(gè)坑:BETWEEN 是個(gè)閉區(qū)間,也就是說其結(jié)束時(shí)間是包含在統(tǒng)計(jì)范圍內(nèi)的所以,我們應(yīng)該用 今晚零點(diǎn) >= 時(shí)間 AND 時(shí)間 < 明晚零點(diǎn) 才能準(zhǔn)確查出今天的數(shù)據(jù)強(qiáng)制濃綠的拼音怎么寫指定時(shí)區(qū)。
有時(shí)候,用戶期望使用的時(shí)區(qū)并不是自己所在的時(shí)區(qū),比如當(dāng)用戶到其它時(shí)區(qū)出差時(shí),可能關(guān)心的仍然是自己原來的時(shí)區(qū)除了讓用戶強(qiáng)制修改客戶端的時(shí)區(qū)之外,還可以允許當(dāng)前用戶指定一個(gè)時(shí)區(qū),在應(yīng)用服務(wù)器上用這個(gè)時(shí)區(qū)進(jìn)行換算。
不過,這種情況下客戶端需要對(duì)日期選擇器進(jìn)行特殊處理,以便讓用戶感知的日期與實(shí)際使用的日期保持一致指定數(shù)據(jù)庫(kù)會(huì)話的時(shí)區(qū)我們經(jīng)常需要根據(jù)年月日周等標(biāo)準(zhǔn)進(jìn)行統(tǒng)計(jì)這時(shí)候只通過指定區(qū)間就不容易統(tǒng)計(jì)了我們可以把數(shù)據(jù)庫(kù)會(huì)話的時(shí)區(qū)修改為用戶期望的時(shí)區(qū)。
比如 alter session set time_zone = ‘+08:00’;這樣一來,我們?cè)?SQL 中使用的函數(shù)就能得到正確的年月日周等濃綠的拼音怎么寫時(shí)區(qū)相關(guān)的結(jié)果了總結(jié)時(shí)間包含很多相關(guān)卻又容易混淆的概念特別是我們的日常用語往往不是很精確,這就留下了不少隱患。
仔細(xì)區(qū)分這些概念,并且在思考的時(shí)候刻意使用這些精確的概念,可以避免很多與時(shí)間有關(guān)的 BUG文/Thoughtworks汪志成原文鏈接:https://insights.thoughtworks.cn/timezone-timestamp-format/
更多精彩洞見,請(qǐng)關(guān)注微信公眾號(hào):Thoughtworks洞見