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