如何根据时区将时刻转换为另一个时刻 [英] How to convert Moment to another moment depending on timezone

查看:163
本文介绍了如何根据时区将时刻转换为另一个时刻的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在JS中真的很糟糕,我正在苦苦挣扎。我希望是:从div(UTC)获取日期并根据日期转换这个日期在用户的时区。



因此,如果UTC日期是2017年3月30日上午6:34:22
纽约有人看到2017年3月30日2:34: 22 AM
Perth的某个人看到30/03/2017 2:34:22 PM



我在C#中用TimeZoneInfo和IsDaylightSavingTime做了类似的事情,但我不知道知道如何在JS中这样做。



在我的代码下面:

  //< div id =utc-time> 30/03/2017 6:34:22 AM< / div> 

var dt = document.getElementById(utc-time)。innerHTML;
var m = moment(dt,DD-MM-YYYY hh:mm:ss a);
var tz = moment.tz.guess();
var user = moment.tz(dt,DD-MM-YYYY hh:mm:ss a,tz);
var mString = m.toString();

// Console.log
// -----------
dt = 30/03/2017 6:34:22 AM
m = 1490826862000
user = Thu Mar 30 2017 06:34:22 GMT + 0800
mString = Wed Mar 29 2017 22:34:22 GMT + 0000

看起来创建的时刻不是UTC,而是保留当地时区。提示会很好:)

解决方案

你可以使用片刻 local() 将时刻对象转换为用户本地时间,同时可以使用 tz() 转换区域之间的时间。



使用 moment.utc 将日期解析为UTC。使用 format() 显示时刻对象的值。



如果您只需要支持UTC和用户当地时间,则不需要时刻时区。



这是一个工作样本:



  var dt =的document.getElementById( UTC时间)的innerHTML。 var m = moment.utc(dt,DD-MM-YYYY h:mm:ss A); //将输入解析为UTCconsole.log(m.clone()。local()。format(DD-MM-YYYY h:mm:ss A)); // local timevar tz ='America / New_York'; //示例值,你可以使用moment.tz.guess()console.log(m.clone()。tz(tz).format(DD-MM-YYYY h:mm:ss A)); // 30-03-2017 2:34:22 AMtz ='Australia / Perth'; console.log(m.clone()。tz(tz).format(DD-MM-YYYY h:mm:ss A )); // 30-03-2017 2:34:22 PM  

 < 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.7/moment-timezone-with-data-2010-2020.min.js\"></script><div id =utc -time> 30/03/2017 6:34:22 AM< / div>  


I really bad in JS and I'm struggling with moment.js

My wish is: get a date from a div (UTC) and convert this date depending on the timezone of the user.

So if the UTC date is 30/03/2017 6:34:22 AM Someone in New York sees 30/03/2017 2:34:22 AM Someone in Perth sees 30/03/2017 2:34:22 PM

I did something similar in C# with TimeZoneInfo and IsDaylightSavingTime but I don't know how to do this in JS.

Below my code:

// <div id="utc-time">30/03/2017 6:34:22 AM</div>

var dt = document.getElementById("utc-time").innerHTML;  
var m = moment(dt, "DD-MM-YYYY hh:mm:ss a");
var tz = moment.tz.guess();
var user = moment.tz(dt, "DD-MM-YYYY hh:mm:ss a", tz);
var mString = m.toString();

// Console.log
// -----------
dt = 30/03/2017 6:34:22 AM
m = 1490826862000
user = Thu Mar 30 2017 06:34:22 GMT+0800
mString = Wed Mar 29 2017 22:34:22 GMT+0000

It looks like the moment created is not UTC but keep the local timezone. A hint would be nice :)

解决方案

You can use moment local() to convert moment object to user local time, while you can use tz() to convert time between zones.

Use moment.utc to parse date as UTC. Use format() to show values of moment objects.

If you just need to support UTC and user local time, you don't need moment-timezone.

Here a working sample:

var dt = document.getElementById("utc-time").innerHTML;  
var m = moment.utc(dt, "DD-MM-YYYY h:mm:ss A"); // parse input as UTC
console.log(m.clone().local().format("DD-MM-YYYY h:mm:ss A")); // local time
var tz = 'America/New_York'; // example value, you can use moment.tz.guess()
console.log(m.clone().tz(tz).format("DD-MM-YYYY h:mm:ss A")); // 30-03-2017 2:34:22 AM
tz = 'Australia/Perth';
console.log(m.clone().tz(tz).format("DD-MM-YYYY h:mm:ss A")); // 30-03-2017 2:34:22 PM

<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.7/moment-timezone-with-data-2010-2020.min.js"></script>

<div id="utc-time">30/03/2017 6:34:22 AM</div>

这篇关于如何根据时区将时刻转换为另一个时刻的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆