繁体   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