5個(gè)關(guān)于API中日期和時(shí)間設(shè)計(jì)規(guī)則
比方說(shuō),你要建立你的第一個(gè)API,將它變成公共、私人、或一些混合的產(chǎn)品。不要感到驚訝,如果你的第一個(gè)缺陷是和日期/時(shí)間相關(guān)的,那么不要低估你可能當(dāng)涉及到處理日期和時(shí)期的時(shí)候所帶來(lái)的麻煩。當(dāng)涉及到處理的日期和時(shí)間問(wèn)題時(shí),你可以進(jìn)來(lái)看看。這里有一些技巧可以讓你擺脫這種潛在的麻煩。
警告:我假設(shè)你使用公歷。在國(guó)際場(chǎng)合,這可能是一個(gè)糟糕的假設(shè)。如果你在一個(gè)不同的日歷算法中操作,這不會(huì)幫助你。規(guī)則 #1 使用ISO-8601格式作為你的日期格式
這是沒(méi)有可討論的余地的。從W3C 到 IETF, 還有甚至 XKCD, 互聯(lián)網(wǎng)一直使用這個(gè)標(biāo)準(zhǔn)。不要自作聰明的使用其他。ISO-8601提供一系列的品種,來(lái)顯示日期/時(shí)間/時(shí)區(qū)。
通過(guò)*nux控制臺(tái)來(lái)快速看看ISO-8601格式,輸入如下命令:
ISO 8601 解決了很多問(wèn)題,包括:
- 自然排序 - 簡(jiǎn)單和優(yōu)雅,免去多余的工作即可實(shí)現(xiàn)排序
- 時(shí)區(qū)偏移 - 代表用戶的地點(diǎn)和時(shí)區(qū)在日益增長(zhǎng)的全球化和移動(dòng)世界中越來(lái)越重要。
- 地區(qū)中立性 - 想象一下噩夢(mèng)一般的日期 2/3/4。這個(gè)日期隨著你所處美國(guó),歐洲或者其他地方而有不同的含義...這個(gè)日期在美國(guó)代表Feb 3, 2004,或者在其他地方代表Mar 2, 2004。在ISO 8601條款中,2004-02-03去掉了這些含糊的可能性。
- 在不同的編程語(yǔ)言中都得到廣泛的支持 - 即使不是所有的語(yǔ)言都使用這個(gè)標(biāo)準(zhǔn)作為默認(rèn)值(例如Java),但是它們基本都有成熟的庫(kù)來(lái)轉(zhuǎn)化 ISO 8601格式。不要自作聰明來(lái)自己實(shí)現(xiàn)哦。
規(guī)則#2: 接受任何的時(shí)區(qū)
現(xiàn)在你有一個(gè)ISO-8601的工具了,但憑什么你能夠獲取到有關(guān)時(shí)區(qū)的偏移數(shù)據(jù)呢,用它吧!我們?cè)谝粋€(gè)全球化的時(shí)代。尤其是如果你的API是對(duì)外開(kāi)放的,你將無(wú)可爭(zhēng)議地要解決全球消費(fèi)者的問(wèn)題。不要去假設(shè)你的API使用者是用那個(gè)時(shí)區(qū)。
規(guī)則#3:用UTC(Coordinated Universal Time 世界同一時(shí)間)格式存儲(chǔ)
這是大多數(shù)系統(tǒng)實(shí)際設(shè)計(jì)的一般規(guī)律。我已經(jīng)記不清我看過(guò)多少次按照原公司總部時(shí)區(qū)建立的系統(tǒng)。不可避免的,除非你是紀(jì)律嚴(yán)明,用戶最終不會(huì)用你的公司的時(shí)區(qū)看他們的時(shí)間。這很讓人討厭,尤其是當(dāng)他們處在地球的另一端的時(shí)候。
UTC,或者世界標(biāo)準(zhǔn)時(shí)間,是最常見(jiàn)最有共性存儲(chǔ)的時(shí)間,因?yàn)樗槐硎救魏螘r(shí)區(qū)偏移量。這讓你可以根據(jù)你系統(tǒng)的需要,給出整個(gè)系統(tǒng)時(shí)區(qū)的建議日期,無(wú)論是哪個(gè)時(shí)區(qū)都是恰當(dāng)?shù)摹?/p>
規(guī)則#4 使用UTC格式作為返回值格式
UTC可以允許你的API調(diào)用者免去計(jì)算偏移到他們所需要的日期的工作。而對(duì)于你,更重要的是,你的API組不需要為每一次調(diào)用都去煩惱如何計(jì)算它的偏移值。在你的API文檔和系統(tǒng)支持中,對(duì)于你如何處理日期,只需簡(jiǎn)單的說(shuō)“你獲取的是UTC格式”。
規(guī)則#5 如果你不需要時(shí)間的話,不要使用它
ISO 8601同樣允許我們靈活的提供一個(gè)日期而不帶時(shí)間。在時(shí)間不重要的場(chǎng)合中,只使用日期(例如“目標(biāo)完成日期”):不要保存或者返回時(shí)間。雖然對(duì)于只保存11:59pm沒(méi)什么壞處,或者其他隨機(jī)時(shí)間,但是,你可能在日期國(guó)際化的時(shí)候會(huì)碰到很大麻煩。
想象一下,你使用UTC格式保存2013-03-01T23:59:59,代表Mar 1,2013?,F(xiàn)在,對(duì)于中國(guó)標(biāo)準(zhǔn)時(shí)間(UTC+0800)作時(shí)差計(jì)算,你現(xiàn)在是表示Mar 2, 2013 早上8點(diǎn)。這會(huì)有麻煩,因?yàn)槿掌诒徽`讀了。在這個(gè)例子中,我們只需要使用2013-03-01,不帶任何時(shí)間/時(shí)區(qū)時(shí)差,來(lái)免除日期的解析誤讀的可能性?,F(xiàn)在流行的數(shù)據(jù)庫(kù)都支持只包含日期的格式。
總結(jié)
當(dāng)所有這些關(guān)于日期的討論可能會(huì)讓你有點(diǎn)麻木,不過(guò)可以放心,幾乎所有的RESTful平臺(tái)都使用這些格式。當(dāng)你需要擺弄數(shù)據(jù)序列化庫(kù)的時(shí)候,需要當(dāng)心,留意當(dāng)它離開(kāi)你的API平臺(tái)的時(shí)候,它會(huì)對(duì)你的日期進(jìn)行什么操作。
我們大部分人都在不同的時(shí)區(qū)或者國(guó)家工作,生活或者交流,我們知道連簡(jiǎn)單的安排一個(gè)約會(huì)都會(huì)讓我們感到有多么的疑惑。還有,如果你不希望寫(xiě)一大堆日期轉(zhuǎn)換和格式化的東西,你可能會(huì)希望有一個(gè)標(biāo)準(zhǔn)來(lái)代表時(shí)間。好好運(yùn)用這些規(guī)則來(lái)處理你的日期和時(shí)間,你就可以減輕很多煩惱。
譯文鏈接:http://www.oschina.net/translate/5-laws-api-dates-and-times