簡體   English   中英

MomentJS 從 UTC 轉換為所需的時區,而不僅僅是本地

[英]MomentJS convert from UTC to desired timezone, not just local

我正在使用 momentjs,但在嘗試將 UTC 時間轉換為由名稱'America/New_York'指定的特定時區(不一定是當前用戶本地)時遇到問題。 這個問題很相似,但並沒有真正的幫助。

我的思考過程是使用從服務器接收到的日期創建一個 utc 時刻 obj,然后將該 UTC 時間格式化為特定時區以進行顯示。 我目前如何處理這個問題的一小段:

var cutoffString = '20170421 16:30:00'; // in utc
var utcCutoff = moment.tz(cutoffString, 'YYYYMMDD HH:mm:ss', '+00:00');
var displayCutoff = 
        moment.tz(utcCutoff.format('YYYYMMDD HH:mm:ss'), 'YYYYMMDD HH:mm:ss', 'America/New_York');

console.log('utcCutoff:', utcCutoff.format('YYYYMMDD hh:mm:ssa Z')); // => utcCutoff: 20170421 04:30:00pm +00:00
console.log('displayCutoff:', displayCutoff.format('YYYYMMDD hh:mm:ssa Z')); // => displayCutoff: 20170421 04:30:00pm +00:00

我在這里的假設是 displayCutoff 將是 'America/New_York' 時間顯示的 utcCutoff 時間。 但它目前與 utcCutoff 對象顯示相同的時間。 我還應該提到使用.utc()而不是.tz並在應用.local()后嘗試操縱時區也不起作用。

任何幫助/指導將不勝感激。

您可以使用moment.utc因為您的輸入是UTC字符串。 您可以使用tz將您的時刻對象轉換為給定時區。

請注意, tz函數將moment對象轉換為給定區域,同時使用moment.tz解析函數,該函數使用給定區域構建新的時刻對象。 當你這樣做時:

var displayCutoff = 
    moment.tz(utcCutoff.format('YYYYMMDD HH:mm:ss'), 'YYYYMMDD HH:mm:ss', 'America/New_York');

你沒有將utcCutoff轉換為'America/New_York'但是你正在為紐約的20170421 16:30:00建立一個新的時刻對象。

這是您的代碼的更新版本:

 var cutoffString = '20170421 16:30:00'; // in utc var utcCutoff = moment.utc(cutoffString, 'YYYYMMDD HH:mm:ss'); var displayCutoff = utcCutoff.clone().tz('America/New_York'); console.log('utcCutoff:', utcCutoff.format('YYYYMMDD hh:mm:ssa Z')); // => utcCutoff: 20170421 04:30:00pm +00:00 console.log('displayCutoff:', displayCutoff.format('YYYYMMDD hh:mm:ssa Z')); // => displayCutoff: 20170421 12:30:00pm -04:00 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.11/moment-timezone-with-data-2010-2020.min.js"></script> 

Moment timezone插件正是您所需要的: http//momentjs.com/timezone/

var dec = moment("2014-12-01T12:00:00Z");
dec.tz('America/New_York').format('ha z');  // 5am PDT

使用momentjs-timezone您可以將任何時區轉換為任何其他時區。

您需要在格式化目標時區之前指定開始時區。

這是一個將日期時間從 UTC 轉換為其他三個時區的示例:

const moment = require('moment-timezone')

const start = moment.tz("2021-12-08T10:00:00", "UTC") // original timezone

console.log(start.tz("America/Los_Angeles").format())
console.log(start.tz("Asia/Calcutta").format())
console.log(start.tz("Canada/Eastern").format())

這將打印出:

2021-12-08T02:00:00-08:00
2021-12-08T15:30:00+05:30
2021-12-08T05:00:00-05:00

除了 UTC 作為開始時區,您也可以使用任何其他時區,例如“亞洲/首爾”,顯然使用相同的腳本會得到不同的結果:

const moment = require('moment-timezone')

const start = moment.tz("2021-12-08T10:00:00", "Asia/Seoul")

console.log(start.tz("America/Los_Angeles").format())
console.log(start.tz("Asia/Calcutta").format())
console.log(start.tz("Canada/Eastern").format())

這打印出來:

2021-12-07T17:00:00-08:00
2021-12-08T06:30:00+05:30
2021-12-07T20:00:00-05:00

此處列出了所有 momentjs 時區:

https://gist.github.com/diogocapela/12c6617fc87607d11fd62d2a4f42b02a

無需使用MomentJs將您的時區轉換為特定時區。 只需按照下面給出的代碼,它將適用於您:

 $(document).ready(function() { //EST setInterval( function() { var estTime = new Date(); var currentDateTimeCentralTimeZone = new Date(estTime.toLocaleString('en-US', { timeZone: 'America/Chicago' })); var seconds = currentDateTimeCentralTimeZone.getSeconds(); var minutes = currentDateTimeCentralTimeZone.getMinutes(); var hours = currentDateTimeCentralTimeZone.getHours();//new Date().getHours(); var am_pm = currentDateTimeCentralTimeZone.getHours() >= 12 ? "PM" : "AM"; if (hours < 10){ hours = "0" + hours; } if (minutes < 10){ minutes = "0" + minutes; } if (seconds < 10){ seconds = "0" + seconds; } var mid='PM'; if(hours==0){ //At 00 hours we need to show 12 am hours=12; } else if(hours>12) { hours=hours%12; mid='AM'; } var x3 = hours+':'+minutes+':'+seconds +' '+am_pm // Add a leading zero to seconds value $("#sec").html(x3); },1000); }); 
 <!DOCTYPE html> <html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> </head> <body> <p class="date_time"><strong id="sec"></strong> </p> </body> </html> 

暫無
暫無

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

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