簡體   English   中英

將時區格式的日期顯示為UTC時間

[英]Displaying timezone-formatted date as UTC time

在我的界面上,我嘗試顯示基於特定時區的日期。 在此示例中,我將使用Americas / New_York作為時區。 這就是我做的。

    $scope.getStartTime = function(){
        var date = new Date();
        return moment(date).tz("Americas/New_York").format('YYYY-MM-DD HH:mm:ss');
    };

之后,我想發送此數據並將其發送到我的服務器。 但是,在我的服務器中,我希望它始終被序列化為UTC時間,而不是紐約時區(EST)。

例如,如果在紐約的時間是12:00 PM,那么在將其發送到后端之前,該時間將在UTC時間序列化為4:00 PM。 這是我的嘗試:

    var date = getStartTime();
    ....
    // Display the date in the UI
    ....
    $scope.revertStartTime(date);

    $scope.revertStartTime = function(startTime) {
        console.log("Start time: ", startTime);
        console.log("Moment: ", moment(startTime).format());
        console.log("Converted to utc time: ", moment().utc(startTime).format());
        return moment.utc(startTime).format("YYYY-MM-DD'T'HH:mm:ss.SSSZ");
    }

我試圖通過使用moment().utc()函數來還原開始時間,並希望該日期將更改為基於UTC的日期,但是不幸的是,它一直將我的日期變為本地化日期而不是UTC日期,但我沒有確定為什么。 任何幫助,將不勝感激。 謝謝!

編輯:

嘗試遵循以下方法,這是我所做的:

    $scope.getStartTime = function(){
        var date = new Date();
        var startTime = new moment(date).tz($rootScope.userinfo.timeZone).format('YYYY-MM-DD HH:mm:ss');
        $rootScope.offset = moment().utcOffset(startTime);    
        console.log("offset: ", $rootScope.offset);
        return startTime;
    };

    $scope.revertStartTime = function(startTime) {
        console.log("User Selected Time: ", moment().utcOffset(startTime).format('YYYY-MM-DD HH:mm:ss'));
        return moment().utcOffset(startTime).format('YYYY-MM-DD HH:mm:ss');
    }

但是我得到的只是一個錯誤,說revertStartTime返回一個Invalid Date

一些東西:

  • 希望這是一個錯字,但要指出的是,區域ID是America/New_York ,而不是Americas/New_York

  • 您可以將值傳遞為moment.utc(foo)moment(foo).utc() ,但不能moment(foo).utc() moment().utc(foo) 區別在於,一個將輸入解釋為UTC並停留在UTC模式,而另一個僅切換到UTC模式。 您也可以將其視為“轉換為UTC”,但實際上基本時間戳記值不會改變。

  • 是的,您可以切換到UTC模式並調用格式,但是無論您處於哪種模式,都可以僅調用.toISOString() 。這已經是您要查找的ISO格式。

  • 請注意,如果從一個唯一的時間點開始,然后以轉換為UTC結束,則中間的切換時區或偏移量都不會改變結果。 換句話說,這些都是等效的:

     moment().toISOString() moment.utc().toISOString() moment(new Date()).toISOString() moment.utc(new Date()).toISOString() moment(new Date()).utc().toISOString() moment().tz('America/New_York').toISOString() moment.tz('America/New_York').toISOString() moment().utcOffset(1234).toISOString() moment.utc().format('YYYY-MM-DD[T]HH:mm:ss.SSS[Z]') moment().utc().format('YYYY-MM-DD[T]HH:mm:ss.SSS[Z]') 

    甚至只有最后兩個需要處於UTC模式,因為如果處於本地模式或處於特定時區,那么format函數將產生不同的輸出。

為了完成此操作,您需要使用.utcOffset() 從Moment 2.9.0開始,它是首選方法。 此函數使用相對於UTC的實際偏移量,而不使用反向偏移量(例如,夏令時期間,紐約為-240)。 像“ +0400”這樣的偏移字符串的作用與以前相同:

// always "2013-05-23 00:55"
moment(1369266934311).utcOffset(60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).utcOffset('+0100').format('YYYY-MM-DD HH:mm')

Moment.js 2.9.0中棄用了較舊的.zone()作為設置器 它接受含有時區標識符的字符串(例如,“-0400”或“-04:00”為-4小時),或者表示后面 UTC分鍾數(例如,240為夏令時期間,紐約)。

// always "2013-05-23 00:55"
moment(1369266934311).zone(-60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).zone('+0100').format('YYYY-MM-DD HH:mm')

要使用命名時區而不是數字偏移量,請包括Moment Timezone並使用.tz()代替:

// determines the correct offset for America/Phoenix at the given moment
// always "2013-05-22 16:55"
moment(1369266934311).tz('America/Phoenix').format('YYYY-MM-DD HH:mm')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM