時(shí)間轉(zhuǎn)換噪漾,可能真的要注意這個(gè)坑(來(lái)自SimpleDateFormat的陰暗面)

一個(gè)坑

我們經(jīng)常在客戶端做一些與時(shí)間相關(guān)的需求,比如 在6點(diǎn)~12點(diǎn)要展示一個(gè)新的廣告位且蓬。

為了解決上述問(wèn)題怪与,我們通常把 開始、結(jié)束時(shí)間格式和服務(wù)端做好約定缅疟,通過(guò)配置下發(fā),如 startTime=2017-10-19 15:00:00遍愿。
客戶端用 當(dāng)前時(shí)間配置時(shí)間 做對(duì)比存淫,來(lái)完成切換。

為了防止客戶端任意篡改時(shí)間沼填,我們不會(huì)直接去讀取客戶端時(shí)間(也就是 System.currentTimeMillis() 轉(zhuǎn)化而來(lái)的時(shí)間)桅咆,我們會(huì)獲取當(dāng)前服務(wù)端時(shí)間(這里不做展開)。

而為了解析配置中的時(shí)間坞笙,我們需要一個(gè)常用的 SimpleDateFormat類來(lái)幫助我們解析岩饼。用法如下:

上述代碼看上去毫無(wú)問(wèn)題荚虚,我們將 配置中的時(shí)間 解析成了時(shí)間戳,并且籍茧,我們還注意到了時(shí)區(qū)問(wèn)題版述,使用了Locale.CHINA 東8區(qū)來(lái)解析,規(guī)避掉了用戶手動(dòng)切時(shí)區(qū)而導(dǎo)致解析異常(因?yàn)?我們的服務(wù)器時(shí)間是采用了東8區(qū)時(shí)間)寞冯。恩渴析,總而言之,非常棒吮龄。

于是乎俭茧,我們代碼上線了,等到了2017-10-19 15點(diǎn)漓帚,靜靜等待著廣告位流量暴增母债。

可是還沒(méi)到15點(diǎn),11點(diǎn)......一波流量進(jìn)來(lái)尝抖、12點(diǎn).... 流量曲線變抖了毡们、13點(diǎn).....繼續(xù)爆發(fā)...

來(lái)來(lái),review一波

整點(diǎn)流量曲線變化明顯牵署,很快意識(shí)到可能被時(shí)區(qū)坑了 漏隐。

由于獲取服務(wù)端時(shí)間已經(jīng)上線很久了大量業(yè)務(wù)方在使用,沒(méi)出現(xiàn)過(guò)時(shí)區(qū)問(wèn)題奴迅。所以直接被排除青责。
剩下的,就是這3行代碼了取具。脖隶。。暇检。

因此不得不來(lái)檢查一下 這3行代碼产阱。。What fuck 块仆,你告訴我构蹬,這么和諧用法,特喵有什么問(wèn)題悔据。庄敛。

Run 一下

肉眼是看不出來(lái)什么問(wèn)題了,跑一下科汗。

Out put:

time:1508396400000

反查之:1508396400000 ->Thu Oct 19 2017 15:00:00 GMT+0800 (CST)

接著切換本地時(shí)區(qū)藻烤,切到東9區(qū):
Out put:

time:1508392800000

反查之:1508392800000 ->Thu Oct 19 2017 14:00:00 GMT+0800 (CST)

真的。。怖亭。涎显。。提前了兴猩。期吓。。峭跳。膘婶。 一個(gè)小時(shí)。蛀醉。悬襟。。Locale.CHINA拯刁,這個(gè)參數(shù)脊岳,擺設(shè)么?


問(wèn)題定位了垛玻,SimpleDateFormat的錯(cuò)誤用法割捅,導(dǎo)致配置時(shí)間解析出錯(cuò),非東8區(qū)的用戶帚桩,就會(huì)存在時(shí)間不準(zhǔn)問(wèn)題亿驾。

SimpleDateFormat ,我還敢信你么账嚎?

在我吐槽了半小時(shí)SimpleDateFormat后莫瞬,我認(rèn)真打開了源碼,習(xí)慣性的讀了一下類注釋:

可知郭蕉,有3個(gè)用法:

  • formatting(date -> text)
  • parsing (text -> date)
  • normalization

我們用到的是parse疼邀。

parse

可知,parse中的 時(shí)區(qū)召锈,來(lái)自于 TimeZone旁振。而SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)中的Locale.CHINA并非設(shè)置時(shí)區(qū),而是在:

SimpleDateFormat

構(gòu)造方法中的 locale ,被傳入DateFormatSymbols.getInstanceRef(locale);中涨岁,作為設(shè)置 formatData的格式拐袜,這個(gè)參數(shù),會(huì)在 formatting(date -> text)用法中生效梢薪。

因此阻肿,我們需要 正確的設(shè)置解析時(shí)區(qū),應(yīng)該去設(shè)置 TimeZone沮尿。
SimpleDateFormat暴露了setTimeZone(TimeZone zone) 方法可以設(shè)置時(shí)區(qū)。

setTimeZone

由此,我們可以理解Locale.CHINA失效的原因畜疾。

正確用法

parsing (text -> date)

將時(shí)間字符串赴邻,轉(zhuǎn)換成正確的Date

無(wú)論修改到任何時(shí)區(qū)啡捶,都將輸出東8區(qū)時(shí)間:

time:1508396400000

formatting(date -> text)

Date轉(zhuǎn)化成指定時(shí)區(qū)的 時(shí)間字符串格式姥敛。
這個(gè)只會(huì)根據(jù)國(guó)家來(lái)改變展示格式.

輸出:

//系統(tǒng)語(yǔ)言是中文
time:公元 2017/十一月/05 22:42:14 周日 下午  中國(guó)標(biāo)準(zhǔn)時(shí)間
//系統(tǒng)語(yǔ)言是英文
time:AD 2017/November/05 22:45:22 Sun PM  China Standard Time

指定第二個(gè)參數(shù)后:

//系統(tǒng)語(yǔ)言是中文
time:公元 2017/十一月/05 22:42:14 周日 下午  中國(guó)標(biāo)準(zhǔn)時(shí)間
//系統(tǒng)語(yǔ)言是英文
time:公元 2017/十一月/05 22:45:56 周日 下午  中國(guó)標(biāo)準(zhǔn)時(shí)間

其實(shí)都是細(xì)節(jié),注意使用瞎暑,避免入坑彤敛。浩考。

..

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绍载,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子此蜈,更是在濱河造成了極大的恐慌勿她,老刑警劉巖袄秩,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異逢并,居然都是意外死亡之剧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門砍聊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)背稼,“玉大人,你說(shuō)我怎么就攤上這事玻蝌⌒分猓” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵灶伊,是天一觀的道長(zhǎng)疆前。 經(jīng)常有香客問(wèn)我,道長(zhǎng)聘萨,這世上最難降的妖魔是什么竹椒? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮米辐,結(jié)果婚禮上胸完,老公的妹妹穿的比我還像新娘。我一直安慰自己翘贮,他們只是感情好赊窥,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狸页,像睡著了一般锨能。 火紅的嫁衣襯著肌膚如雪扯再。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天址遇,我揣著相機(jī)與錄音熄阻,去河邊找鬼。 笑死倔约,一個(gè)胖子當(dāng)著我的面吹牛秃殉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浸剩,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼钾军,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绢要?” 一聲冷哼從身側(cè)響起吏恭,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袖扛,沒(méi)想到半個(gè)月后砸泛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛆封,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年唇礁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惨篱。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盏筐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砸讳,到底是詐尸還是另有隱情琢融,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布簿寂,位于F島的核電站漾抬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏常遂。R本人自食惡果不足惜纳令,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望克胳。 院中可真熱鬧平绩,春花似錦、人聲如沸漠另。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)笆搓。三九已至性湿,卻和暖如春纬傲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窘奏。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工嘹锁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人着裹。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像米同,于是被迫代替她去往敵國(guó)和親骇扇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容