[英]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.