1.問題來源
測試的同事反饋說APP海外版本的時間與實際時間少了8個小時。於是開始排查問題,最後發現問題出在getTime()函數上。
數據庫裏存儲的數據是Date類型,我將Date類型通過getTime()方法轉換爲時間戳返回給APP顯示。服務運行在Docker上,通過Rancher部署。在打鏡像的時候,我在Dockerfile文件裏指定了時區:
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
我指定的時區是上海(東八區),而我的服務是部署在亞馬遜北美雲服務器上的。getTime()方法與時區有關係,它會根據Docker容器指定的時區來生成時間戳。這樣會導致海外APP在顯示時間時少8個小時。
2.誤解
誤以爲getTime()與時區無關,誤解產生的原因是getTime()方法的註釋:
/**
* Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT
* represented by this <tt>Date</tt> object.
*
* @return the number of milliseconds since January 1, 1970, 00:00:00 GMT
* represented by this date.
*/
public long getTime() {
return getTimeImpl();
}
實際上getTime()與程序真實運行的容器(服務器)所在的時區相關。如果程序運行在東八區,它返回北京時間1970年01月01日08時00分00秒起至現在東八區時間的總毫秒數。如果運行在UTC時區則返回1970年01月01日00時00分00秒起至當前UTC時間的總毫秒數。