getTime()獲取時間戳方法與時區有關

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時間的總毫秒數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章