我正在寻找一种将一个时区的日期转换为另一个时区的函数。
它需要两个参数,
- 日期(格式为“ 2012/04/10 10:10:30 +0000”)
- 时区字符串(“亚洲/雅加达”)
时区字符串在http://en.wikipedia.org/wiki/Zone.tab中进行了描述
是否有捷径可寻?
我正在寻找一种将一个时区的日期转换为另一个时区的函数。
它需要两个参数,
时区字符串在http://en.wikipedia.org/wiki/Zone.tab中进行了描述
是否有捷径可寻?
Answers:
var aestTime = new Date().toLocaleString("en-US", {timeZone: "Australia/Brisbane"});
console.log('AEST time: '+ (new Date(aestTime)).toISOString())
var asiaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Shanghai"});
console.log('Asia time: '+ (new Date(asiaTime)).toISOString())
var usaTime = new Date().toLocaleString("en-US", {timeZone: "America/New_York"});
console.log('USA time: '+ (new Date(usaTime)).toISOString())
var indiaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Kolkata"});
console.log('India time: '+ (new Date(indiaTime)).toISOString())
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString
toLocaleString
,但是随后却非常错误地显示了将该字符串传递回Date
构造函数。那是自找麻烦。日期字符串解析器不需要接受特定于语言环境的格式,并且输入将被视为在本地时区中。不要那样做 只需使用第一个toLocalString
调用的字符串输出即可。
对于moment.js用户,您现在可以使用moment-timezone。使用它,您的函数将如下所示:
function toTimeZone(time, zone) {
var format = 'YYYY/MM/DD HH:mm:ss ZZ';
return moment(time, format).tz(zone).format(format);
}
Date.prototype.toLocaleString
。
从以下地点无耻地被盗:http : //www.techrepublic.com/article/convert-the-local-time-to-another-time-zone-with-this-javascript/6016329
/**
* function to calculate local time
* in a different city
* given the city's UTC offset
*/
function calcTime(city, offset) {
// create Date object for current location
var d = new Date();
// convert to msec
// add local time zone offset
// get UTC time in msec
var utc = d.getTime() + (d.getTimezoneOffset() * 60000);
// create new Date object for different city
// using supplied offset
var nd = new Date(utc + (3600000*offset));
// return time as a string
return "The local time in " + city + " is " + nd.toLocaleString();
}
此功能通过提供城市/国家/地区的名称和偏移值来计算时区值
除Safari外,大多数桌面(非移动)浏览器都支持带有参数的toLocaleString函数,较旧的浏览器通常会忽略这些参数。
new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' })
toLocaleStringSupportsLocales()
使您能够可靠地检查支持的实现。
好,找到了!
我正在使用timezone-js。这是代码:
var dt = new timezoneJS.Date("2012/04/10 10:10:30 +0000", 'Europe/London');
dt.setTimezone("Asia/Jakarta");
console.debug(dt); //return formatted date-time in asia/jakarta
如果您不想导入一些大型库,则可以使用Intl.DateTimeFormat将Date对象转换为不同的时区。
// Specifying timeZone is what causes the conversion, the rest is just formatting
const options = {
year: '2-digit', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', second: '2-digit',
timeZone: 'Asia/Jakarta',
timeZoneName: 'short'
}
const formater = new Intl.DateTimeFormat('sv-SE', options)
const startingDate = new Date("2012/04/10 10:10:30 +0000")
const dateInNewTimezone = formater.format(startingDate)
console.log(dateInNewTimezone) // 12-04-10 17:10:30 GMT+7
偏移量,夏时制和过去的变化将为您解决。
toLocaleString
具有不一致的实现,并且从IE11开始有效。
formatter
对象时,将得到:```timeZone'的选项值'Asia / Jakarta'超出有效范围。预期:['UTC']```
得到它了 !
想要强制显示的日期=服务器日期,不影响本地设置(UTC)。
我的服务器是GMT-6-> new Date()。getTimezoneOffset()= 360。
myTZO = 360;
myNewDate=new Date(myOldDateObj.getTime() + (60000*(myOldDateObj.getTimezoneOffset()-myTZO)));
alert(myNewDate);
您可以使用toLocaleString()方法设置时区。
new Date().toLocaleString('en-US', { timeZone: 'Indian/Christmas' })
在印度,您可以使用“印度/圣诞节”,以下是各种时区,
"Antarctica/Davis",
"Asia/Bangkok",
"Asia/Hovd",
"Asia/Jakarta",
"Asia/Phnom_Penh",
"Asia/Pontianak",
"Asia/Saigon",
"Asia/Vientiane",
"Etc/GMT-7",
"Indian/Christmas"
toLocaleString
溶液已经给3年前。
如果您只需要转换时区,我已经上传了简化版的moment-timezone,仅包含最低限度的功能。它的〜1KB +数据:
S.loadData({
"zones": [
"Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|11e6",
"Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1GQg0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5",
],
"links": [
"Europe/Paris|Europe/Madrid",
]
});
let d = new Date();
console.log(S.tz(d, "Europe/Madrid").toLocaleString());
console.log(S.tz(d, "Australia/Sydney").toLocaleString());
我应该注意,我只能使用哪些外部库。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当前比“美国/芝加哥”早6小时。输出为:
currentUtcTime: 11/25/2016
currentUtcTime Hour: 16
currentUtcTime Minute: 15
currentDateTimeCentralTimeZone: 11/25/2016
currentDateTimeCentralTimeZone Hour: 10
currentDateTimeCentralTimeZone Minute: 15
new Date();
返回本地时区,而不是UTC
If no arguments are provided, the constructor creates a JavaScript Date object for the current date and time according to system settings.
这是我的代码,它工作正常,您可以尝试使用下面的给出演示:
$(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>
currentDateTimeCentralTimeZone.getHours()
?没有它,它将起作用,并且与寻求27的答案相同stackoverflow.com/a/40809160/1404185
您也可以尝试将日期时区转换为印度:
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);
在浏览了包括此页面上的链接在内的内容后,我发现了这篇很棒的文章,使用时区:
总结一下:
获取用户的时区
var tz = moment.tz.guess();
console.info('Timezone: ' + tz);
返回值,例如:时区:Europe / London
设置默认用户时区
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
将日期/时间转换为洛杉矶时间
moment.utc('2016-12-25 07:00').tz('America/Los_Angeles').format('ddd, Do MMMM YYYY, h:mma');
返回时间:2016年12月24日,星期六,晚上11:00
从洛杉矶时间转换为伦敦
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
您可以在文档中探索多种功能。
您可以使用一个名为“ timezones.json”的npm模块;它基本上由一个json文件组成,该文件的对象包含有关夏时制和偏移量的信息。
对于亚洲/雅加达,它将能够返回此对象:
{
"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
希望它有用
熟悉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.DateTimeFormatter.ofPattern('yyyy/MM/dd HH:mm:ss xx'));
var adjustedZonedDateTime = zonedDateTime.withZoneSameInstant(j.ZoneId.of('America/New_York'));
console.log(zonedDateTime.toString(), '=>', adjustedZonedDateTime.toString());
// 2012-04-10T10:10:30Z => 2012-04-10T06:10:30-04:00[America/New_York]
</script>
在真正的Java性质中,这很冗长。但是,作为一个移植的Java库,特别是考虑到它们移植了1800'ish测试用例,它可能也可以非常精确地工作。
计时操作很难。这就是为什么许多其他库在极端情况下会出错的原因。Moment.js似乎正确设置了时区,但是我见过的其他js库(包括)timezone-js
似乎并不值得信赖。
我最近在Typescript中做到了这一点:
// fromTimezone example : Europe/Paris, toTimezone example: Europe/London
private calcTime( fromTimezone: string, toTimezone: string, dateFromTimezone: Date ): Date {
const dateToGetOffset = new Date( 2018, 5, 1, 12 );
const fromTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: fromTimezone, hour12: false } );
const toTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: toTimezone, hour12: false } );
const fromTimeHours: number = parseInt( fromTimeString.substr( 0, 2 ), 10 );
const toTimeHours: number = parseInt( toTimeString.substr( 0, 2 ), 10 );
const offset: number = fromTimeHours - toTimeHours;
// convert to msec
// add local time zone offset
// get UTC time in msec
const dateFromTimezoneUTC = Date.UTC( dateFromTimezone.getUTCFullYear(),
dateFromTimezone.getUTCMonth(),
dateFromTimezone.getUTCDate(),
dateFromTimezone.getUTCHours(),
dateFromTimezone.getUTCMinutes(),
dateFromTimezone.getUTCSeconds(),
);
// create new Date object for different city
// using supplied offset
const dateUTC = new Date( dateFromTimezoneUTC + ( 3600000 * offset ) );
// return time as a string
return dateUTC;
}
我使用“ en-UK”格式,因为它很简单。可能是“ en-US”或其他有效的方法。
如果第一个参数是您的语言环境时区,第二个参数是您的目标时区,则它将返回具有正确偏移量的Date对象。
我在使用Moment Timezone时遇到了麻烦。如果有人遇到相同的问题,我将添加此答案。所以我有一个2018-06-14 13:51:00
来自我的日期字符串API
。我知道这存储在其中,UTC
但字符串本身并不代表。
我通过执行以下操作告知时区,该日期来自哪个时区:
let uTCDatetime = momentTz.tz("2018-06-14 13:51:00", "UTC").format();
// If your datetime is from any other timezone then add that instead of "UTC"
// this actually makes the date as : 2018-06-14T13:51:00Z
现在,我想通过执行以下操作将其转换为特定时区:
let dateInMyTimeZone = momentTz.tz(uTCDatetime, "Asia/Kolkata").format("YYYY-MM-DD HH:mm:ss");
// now this results into: 2018-06-14 19:21:00, which is the corresponding date in my timezone.
只需设置您想要的国家/地区时区,您就可以轻松地在HTML中显示每1分钟更新一次后使用SetInteval()函数进行的更新。函数formatAMPM()管理12小时格式和AM / PM时间显示。
$(document).ready(function(){
var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
pakTime = new Date(pakTime);
var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
libyaTime = new Date(libyaTime);
document.getElementById("pak").innerHTML = "PAK "+formatAMPM(pakTime);
document.getElementById("ly").innerHTML = "LY " +formatAMPM(libyaTime);
setInterval(function(today) {
var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
pakTime = new Date(pakTime);
var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
libyaTime = new Date(libyaTime);
document.getElementById("pak").innerHTML = "PAK "+formatAMPM(pakTime);
document.getElementById("ly").innerHTML = "LY " +formatAMPM(libyaTime);
},10000);
function formatAMPM(date) {
var hours = date.getHours();
var minutes = date.getMinutes();
var ampm = hours >= 12 ? 'pm' : 'am';
hours = hours % 12;
hours = hours ? hours : 12; // the hour '0' should be '12'
minutes = minutes < 10 ? '0'+minutes : minutes;
var strTime = hours + ':' + minutes + ' ' + ampm;
return strTime;
}
});
我不知道将日期对象转换为任何时区的简便方法,但是如果要将日期对象转换为本地时区,则可以将其转换Date.prototype.getTime()
为相应的毫秒数,然后再次转换。
date = new Date('2016-05-24T13:07:20');
date = new Date(date.getTime());
例如,date.getHours()
现在将返回,15
而不是13
如果您像我一样在奥地利(现在是夏天)。
我已经阅读到各种日期时间函数在某些浏览器中可能表现出非标准行为,因此请首先进行测试。我可以确认它可以在Chrome浏览器中使用。
快速,肮脏的手动时标器并返回:
return new Date(new Date().setHours(new Date().getHours()+3)).getHours()