新聞中心
為什么要講一下這個(gè)問題呢?

瑤海網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),瑤海網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為瑤海成百上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的瑤海做網(wǎng)站的公司定做!
很多時(shí)候在項(xiàng)目的開發(fā)中或許沒有接觸過多時(shí)區(qū),項(xiàng)目大多是部署國內(nèi),同時(shí)僅僅為國內(nèi)用戶提供服務(wù),一旦當(dāng)用戶到國外后,項(xiàng)目中的很多時(shí)間都變得與當(dāng)?shù)貢r(shí)間不一樣,對(duì)用戶非常不友好。例如近幾年非?;鸬木€上教育,像一些外籍老師,教小朋友學(xué)英文,如何保證雙方在特定的時(shí)間都進(jìn)入教室,變得非常常見。
對(duì)于多時(shí)區(qū)用戶提供服務(wù),業(yè)界如何處理時(shí)間呢?
在講述業(yè)界的處理之前,我們先來了解幾個(gè)概念。
時(shí)間戳,是指格林尼治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總秒數(shù),用有符號(hào)32位整數(shù)表示。
GMT:Greenwich Mean Time 格林尼治標(biāo)準(zhǔn)時(shí)間。這是以英國格林尼治天文臺(tái)觀測(cè)結(jié)果得出的時(shí)間,這是英國格林尼治當(dāng)?shù)貢r(shí)間,這個(gè)地方的當(dāng)?shù)貢r(shí)間過去被當(dāng)成世界標(biāo)準(zhǔn)的時(shí)間。
UT:Universal Time 世界時(shí)。根據(jù)原子鐘計(jì)算出來的時(shí)間。
UTC:Coordinated Universal Time 協(xié)調(diào)世界時(shí)。因?yàn)榈厍蜃赞D(zhuǎn)越來越慢,每年都會(huì)比前一年多出零點(diǎn)幾秒,每隔幾年協(xié)調(diào)世界時(shí)組織都會(huì)給世界時(shí)+1秒(會(huì)出現(xiàn)閏秒即61s,一般不處理),讓基于原子鐘的世界時(shí)和基于天文學(xué)(人類感知)的格林尼治標(biāo)準(zhǔn)時(shí)間相差不至于太大。并將得到的時(shí)間稱為UTC,這是現(xiàn)在使用的世界標(biāo)準(zhǔn)時(shí)間。
GMT和UTC維度不一樣,但值是一樣的,UTC = GTM+0(時(shí)區(qū))
我們都知道時(shí)間都可以用GMT或者UTC來表示,而時(shí)間戳由于是基于格林尼治的特定時(shí)間,在地球上過1秒,在全球任何一個(gè)地方都是1秒,因此同一時(shí)刻,全球的值是一樣的。
可以看看java示例,發(fā)現(xiàn)不同時(shí)區(qū)時(shí)間戳確實(shí)是相等的
- // 獲得不同時(shí)區(qū)的時(shí)間,來計(jì)算時(shí)間戳
- LocalDateTime localDateTime = LocalDateTime.now();
- OffsetDateTime offsetDateTime7 = OffsetDateTime.of(localDateTime.minusHours(1), ZoneOffset.ofHours(7));
- OffsetDateTime offsetDateTime8 = OffsetDateTime.of(localDateTime, ZoneOffset.ofHours(8));
- System.out.println(offsetDateTime7.toEpochSecond() == offsetDateTime8.toEpochSecond()); // true
因此,業(yè)界對(duì)于時(shí)區(qū)的處理基本都是基于時(shí)間戳。
[[358244]]
前后端配合以保證用戶看到的都是本地時(shí)間
針對(duì)此類問題,對(duì)于后端需要注意的是服務(wù)器是否會(huì)部署到不同時(shí)區(qū),建議獲取系統(tǒng)時(shí)間的操作,改成獲取統(tǒng)一一個(gè)時(shí)區(qū)的時(shí)間,再將其轉(zhuǎn)成時(shí)間戳進(jìn)行存儲(chǔ);而前端最主要的則是在請(qǐng)求中傳入時(shí)區(qū)到后端,一般可以在請(qǐng)求頭中添加獲取到的系統(tǒng)的時(shí)區(qū),將時(shí)區(qū)傳入到后端。后端根據(jù)時(shí)區(qū),如+8,則將數(shù)據(jù)庫中的時(shí)間戳,轉(zhuǎn)成對(duì)應(yīng)時(shí)區(qū)的時(shí)間。如下圖
最后,推薦使用java8時(shí)間類去處理,java8中核心的類就幾種:
ZoneId、ZoneOffset主要表示時(shí)區(qū)和偏移
Instant 表示時(shí)間戳,Duration、Period 表示時(shí)間差,前者表示時(shí)間差,后者表示日期差
LocalDate、LocalTime、LocalDateTime表示日期、時(shí)間、日期+時(shí)間
ZonedDateTime、OffsetDateTime含時(shí)區(qū)信息的時(shí)間
當(dāng)前題目:聽干貨君聊項(xiàng)目多時(shí)區(qū)處理
文章來源:http://www.5511xx.com/article/cdgghpc.html


咨詢
建站咨詢
