在JavaScript中将日期转换为另一个时区
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在JavaScript中将日期转换为另一个时区相关的知识,希望对你有一定的参考价值。
我正在寻找一个功能,将日期在一个时区转换为另一个时区。
它需要两个参数,
- 日期(格式为“2012/04/10 10:10:30 +0000”)
- 时区字符串(“亚洲/雅加达”)
时区字符串在http://en.wikipedia.org/wiki/Zone.tab中描述
是否有捷径可寻?
var aestTime = new Date().toLocaleString("en-US", timeZone: "Australia/Brisbane");
aestTime = new Date(aestTime);
console.log('AEST time: '+aestTime.toLocaleString())
var asiaTime = new Date().toLocaleString("en-US", timeZone: "Asia/Shanghai");
asiaTime = new Date(asiaTime);
console.log('Asia time: '+asiaTime.toLocaleString())
var usaTime = new Date().toLocaleString("en-US", timeZone: "America/New_York");
usaTime = new Date(usaTime);
console.log('USA time: '+usaTime.toLocaleString())
var indiaTime = new Date().toLocaleString("en-US", timeZone: "Asia/Kolkata");
indiaTime = new Date(indiaTime);
console.log('India time: '+indiaTime.toLocaleString())
这是我的代码,它工作得很好,你可以试试下面的演示:
$(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()+1;//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>
设置一个带有年份,月份和日期的变量,用“ - ”符号分隔,再加上“T”和时间用HH:mm:ss模式,然后是字符串末尾的+01:00(在我的例子中是时区是+1)。然后使用此字符串作为日期构造函数的参数。
//desired format: 2001-02-04T08:16:32+01:00
dateAndTime = year+"-"+month+"-"+day+"T"+hour+":"+minutes+":00+01:00";
var date = new Date(dateAndTime );
我应该注意到,我可以使用哪些外部库受到限制。 moment.js和timezone-js对我来说不是一个选择。
我拥有的js日期对象是UTC。我需要在特定的时区(在我的情况下为'America / Chicago')中获取此日期的日期和时间。
var currentUtcTime = new Date(); // This is in UTC
// Converts the UTC time to a locale specific format, including adjusting for timezone.
var currentDateTimeCentralTimeZone = new Date(currentUtcTime.toLocaleString('en-US', timeZone: 'America/Chicago' ));
console.log('currentUtcTime: ' + currentUtcTime.toLocaleDateString());
console.log('currentUtcTime Hour: ' + currentUtcTime.getHours());
console.log('currentUtcTime Minute: ' + currentUtcTime.getMinutes());
console.log('currentDateTimeCentralTimeZone: ' + currentDateTimeCentralTimeZone.toLocaleDateString());
console.log('currentDateTimeCentralTimeZone Hour: ' + currentDateTimeCentralTimeZone.getHours());
console.log('currentDateTimeCentralTimeZone Minute: ' + currentDateTimeCentralTimeZone.getMinutes());
UTC目前比“America / Chicago”早6个小时。输出是:
currentUtcTime: 11/25/2016
currentUtcTime Hour: 16
currentUtcTime Minute: 15
currentDateTimeCentralTimeZone: 11/25/2016
currentDateTimeCentralTimeZone Hour: 10
currentDateTimeCentralTimeZone Minute: 15
看了很多,包括这个页面的链接,我发现这篇很棒的文章,使用时刻时区:
总结一下:
获取用户的时区
var tz = moment.tz.guess();
console.info('Timezone: ' + tz);
返回例如:时区:欧洲/伦敦
设置默认用户时区
moment.tz.setDefault(tz);
设置自定义时区
moment.tz.setDefault('America/Los_Angeles');
将日期/时间转换为本地时区,假设原始日期/时间为UTC
moment.utc('2016-12-25 07:00').tz(tz).format('ddd, Do MMMM YYYY, h:mma');
返回:2016年12月25日星期日上午7:00
将日期/时间转换为LA时间
moment.utc('2016-12-25 07:00').tz('America/Los_Angeles').format('ddd, Do MMMM YYYY, h:mma');
退货时间:2016年12月24日星期六,晚上11:00
从LA时间转换为伦敦
moment.tz('2016-12-25 07:00', 'America/Los_Angeles').tz('Europe/London').format( 'ddd, Do MMMM YYYY, h:mma' );
返回:2016年12月25日星期日下午3:00
你也可以使用https://www.npmjs.com/package/ctoc_timezone
它有很简单的实现和格式定制。
更改toTimeZone中的格式:
CtoC.toTimeZone(new Date(),"EST","Do MMM YYYY hh:mm:ss #EST");
输出:
28th Feb 2013 19:00:00 EST
您可以在doc中探索多种功能。
你可以使用一个名为'timezones.json'的npm模块;它基本上由一个json文件组成,其中的对象包含有关夏令时和偏移的信息,....
对于asia / jakarta,它将能够返回此对象:
"value": "SE Asia Standard Time",
"abbr": "SAST",
"offset": 7,
"isdst": false,
"text": "(UTC+07:00) Bangkok, Hanoi, Jakarta",
"utc": [
"Antarctica/Davis",
"Asia/Bangkok",
"Asia/Hovd",
"Asia/Jakarta",
"Asia/Phnom_Penh",
"Asia/Pontianak",
"Asia/Saigon",
"Asia/Vientiane",
"Etc/GMT-7",
"Indian/Christmas"
]
你可以在这里找到它:
https://github.com/dmfilipenko/timezones.json
https://www.npmjs.com/package/timezones.json
希望它有用
您也可以尝试将日期时区转换为印度:
var indianTimeZoneVal = new Date().toLocaleString('en-US', timeZone: 'Asia/Kolkata');
var indainDateObj = new Date(indianTimeZoneVal);
indainDateObj.setHours(indainDateObj.getHours() + 5);
indainDateObj.setMinutes(indainDateObj.getMinutes() + 30);
console.log(indainDateObj);
熟悉java 8 java.time
软件包的人,或者joda-time
可能会喜欢这个街区的新孩子:js-joda库。
安装
npm install js-joda js-joda-timezone --save
例
<script src="node_modules/js-joda/dist/js-joda.js"></script>
<script src="node_modules/js-joda-timezone/dist/js-joda-timezone.js"></script>
<script>
var dateStr = '2012/04/10 10:10:30 +0000';
JSJoda.use(JSJodaTimezone);
var j = JSJoda;
// https://js-joda.github.io/js-joda/esdoc/class/src/format/DateTimeFormatter.js~DateTimeFormatter.html#static-method-of-pattern
var zonedDateTime = j.ZonedDateTime.parse(dateStr, j.D以上是关于在JavaScript中将日期转换为另一个时区的主要内容,如果未能解决你的问题,请参考以下文章
如何在javascript中将日期时间从用户时区转换为EST [重复]
如何在java中使用日光将日期格式从一个时区转换为另一种时区[重复]