我正在寻找一种将一个时区中的日期转换为另一个时区的函数。
它需要两个参数,
日期(格式为“2012/04/10 10:10:30 +0000”)
时区字符串(“亚洲/雅加达”)
http://en.wikipedia.org/wiki/Zone.tab 中描述了时区字符串
是否有捷径可寻?
这是单线:
function convertTZ(date, tzString) { return new Date((typeof date === "string" ? new Date(date) : date).toLocaleString("en-US", {timeZone: tzString})); } // 用法:亚洲/雅加达是 GMT+7 convertTZ("2012/04/20 10:10:30 +0000", "Asia/Jakarta") // 2012 年 4 月 20 日星期二 17:10:30 GMT+0700 ( Western Indonesia Time) // 结果值是常规 Date() object const convertDate = convertTZ("2012/04/20 10:10:30 +0000", "Asia/Jakarta") convertDate.getHours(); // 17 // 奖励:您还可以将 Date 对象放在第一个 arg const date = new Date() convertTZ(date, "Asia/Jakarta") // 雅加达的当前日期时间。
这是 MDN Reference。
注意警告:上面的函数依赖于解析 toLocaleString 结果,它是在 en-US
locale 中格式化的日期字符串,例如 "4/20/2012, 5:10:30 PM"
。每个浏览器可能不接受 en-US
格式的日期字符串到其 Date 构造函数,并且可能会返回意外结果(它可能会忽略夏令时)。
目前所有现代浏览器都接受这种格式并正确计算夏令时,它可能不适用于旧浏览器和/或外来浏览器。
旁注:如果现代浏览器具有 toLocaleDate 功能会很棒,所以我们不必使用这个 hacky 工作。
对于 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
尝试@lambinator 的答案。
Most browsers 支持带参数的 toLocaleString 函数,旧版浏览器通常会忽略参数。
const str = new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' });控制台.log(str);
toLocaleStringSupportsLocales()
实现,可让您可靠地检查支持。
/**
* 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();
// get UTC time in msec
var utc = d.getTime();
// 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();
}
此函数通过提供城市/国家名称和偏移值来计算时区值很有用
好的,找到了!
我正在使用 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 对象转换为不同的时区。
// 指定 timeZone 是导致转换的原因,剩下的只是格式化 const options = { year: '2-digit', month: '2-digit', day: '2-digit', hour: '2-digit' , 分钟: '2-digit', 秒: '2-digit', timeZone: 'Asia/Jakarta', timeZoneName: 'short' } const formatter = new Intl.DateTimeFormat('sv-SE', options) const startingDate = new Date("2012/04/10 10:10:30 +0000") const dateInNewTimezone = formatter.format(startingDate) console.log(dateInNewTimezone) // 12-04-10 17:10:30 GMT+7
偏移量、夏令时和过去的变化将为您处理。
toLocaleString
的实现不一致,从 IE11 开始有效。
formatter
对象时,您会得到:```'timeZone' 的选项值 'Asia/Jakarta' 超出有效范围。预期:['UTC'] ```
new Date(Date.parse(new Intl.DateTimeFormat(...)))
,但请注意 Date.parse 仅是 ES5 及更高版本。
知道了!
想要强制显示的日期 = 服务器日期,无论本地设置 (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
解决方案是 already given 4 years ago。
我应该注意,我在可以使用哪些外部库方面受到限制。 moment.js 和 timezone-js 不是我的选择。
我拥有的 js 日期对象是 UTC。我需要在特定时区(在我的情况下为“美国/芝加哥”)中的该日期获取日期和时间。
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.
如果您只需要转换时区,我已经上传了 moment-timezone 的 stripped-down version,仅具有最低限度的功能。它的 ~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());
这是我的代码,它运行良好,你可以试试下面的演示:
$(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){ //在 00 小时我们需要显示 12 am hours=12; } else if(hours> 12) { hours=hours%12; mid='AM'; } var x3 = hours+':'+minutes+':'+seconds +' '+am_pm // 将前导零添加到秒值 $("#sec" ).html(x3); },1000); });
currentDateTimeCentralTimeZone.getHours()
?没有它,它会起作用,并且与 seek27 的答案相同stackoverflow.com/a/40809160/1404185
new Date(string)
时使用系统语言环境的 JS 解释器,因此强制使用 AM/PM 时间和美国格式的日期是在找麻烦恕我直言。
设置一个变量,其中 year
、month
和 day
用 -
符号分隔,加上 T
和 HH:mm:ss 模式的时间,后跟 {6 } 在字符串的末尾(在我的例子中,时区是 +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 );
您也可以使用 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
您可以在文档中探索多种功能。
您也可以尝试将日期时区转换为印度:
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);
let local_time = new Date(zulu_time.getTime() + 3600000*std_timezone.timezone_factor - 60*60*1000);让 date_str = local_time.toISOString().slice(0, 10);让 time_str = local_time.toISOString().slice(11, -1);让 timezone_str = std_timezone.timezone_str;
我最近在 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 对象。
看了很多,包括这个页面的链接,我发现了这篇很棒的文章,使用时刻时区:
总结一下:
获取用户的时区
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
将日期/时间转换为洛杉矶时间
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
提供所需的时区,例如“亚洲/德黑兰”以将当前时间更改为该时区。我用的是“亚洲/首尔”。
您可以使用以下代码。如果需要,请更改样式。
请记住,如果您想使用 h:m:s 格式而不是 HH:MM:SS,则必须删除“function kcwcheckT(i)”。
函数 kcwcheckT(i) { if (i < 10) { i = "0" + i; } 返回我; } function kcwt() { var d = new Date().toLocaleString("en-US", {timeZone: "Asia/Seoul"}); d = 新日期(d); var h = d.getHours(); var m = d.getMinutes(); var s = d.getSeconds(); h = kcwcheckT(h); m = kcwcheckT(m); s = kcwcheckT(s); document.getElementById("kcwcurtime").innerHTML = h + ":" + m + ":" + s; var days = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]; document.getElementById("kcwcurday").innerHTML = days[d.getDay()] } kcwt(); window.setInterval(kcwt, 1000); @import url('https://fonts.googleapis.com/css2?family=Nunito&display=swap'); .kcwsource {color:#040505;cursor: pointer;display:block;width: 100%;border: none;border-radius:5px;text-align:center;padding: 5px 10px 5px 10px;} .kcwsource p {font -family: 'Nunito', sans-serif;} .CurTbx {color:#040505;cursor: pointer;display:block;width: 100%;border: none;border-radius:5px;text-align:center;padding : 5px 10px 5px 10px;} .kcwcstyle {font-family: 'Nunito', sans-serif;字体大小:22px;显示:内联块;} .kcwcurstinf {字体系列:'Nunito',无衬线; font-size: 18px;display: inline-block;margin: 0;} .kcwcurday {margin: 0;} .kcwcurst {margin: 0 10px 0 5px;} /*使用下面的css你可以让你的样式响应!* / @media (max-width: 600px){ .kcwcstyle {font-size: 14px;} .kcwcurstinf {font-size: 12px;} }
这支笔最初是为< a href="http://kocowafa.com" target="_blank">KOCOWAFA.com
(韩国首尔)
做起来很简单:
const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;控制台.log(时区); var d = 新日期(); console.log(d.toLocaleString('en-US', { timeZone }));
使用 luxon 库:
import { DateTime } from "luxon";
// Convert function:
const convertTz = (datetime, fromTz, toTz, format='yyyy-MM-dd HH:mm:ss') => {
return DateTime.fromFormat(datetime, format, { zone: fromTz }).setZone(toTz).toFormat(format);
}
// Use it like this:
console.log(convertTz('2021-10-03 19:00:00', 'Europe/Lisbon', 'America/New_York'));
我不知道将日期对象转换为任何时区的简单方法,但是如果要将其转换为本地时区,只需将其与 Date.prototype.getTime()
转换为相应的毫秒数,然后再返回.
让 date0 = new Date('2016-05-24T13:07:20');让 date1 = new Date(date0.getTime()); console.log(`${date0}\n${date1}`);
例如,如果您和我一样在奥地利(现在是夏天),date.getHours()
现在将返回 15
而不是 13
。
我已经读到各种日期时间函数可能在某些浏览器中表现出非标准行为,所以首先测试一下。我可以确认它在 Chrome 中有效。
熟悉 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
,似乎并不值得信赖。
我在使用 Moment Timezone 时遇到问题。我添加这个答案只是为了如果其他人面临同样的问题。所以我有一个来自我的 API
的日期字符串 2018-06-14 13:51:00
。我知道这存储在 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 中显示它每分钟后使用 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;
}
});
有服务器问题选择 gmt+0000 标准时区您可以通过在 javascript 中使用库 moment-timezone 来更改它
const moment = require("moment-timezone")
const dateNew = new Date()
const changeZone = moment(dateNew);
changeZone.tz("Asia/Karachi").format("ha z");
// here you can paste "your time zone string"
所有这些答案都有些多余,但这对我来说可以获取具有特定小时偏移量的当前 Date 对象。
function hourToMs(hour) { 返回小时 * 60 * 1000 * 60; } function minToMs(min) { return min * 60 * 1000; } function getCurrentDateByOffset(offset) { // 以毫秒为单位获取当前时区以重置回 GMT aka +0 let timezoneOffset = minToMs((new Date()).getTimezoneOffset()); // 以毫秒为单位获取所需的偏移量,反转该值,因为 javascript 是无效的 let desiredOffset = hourToMs(offset * -1);返回新日期(Date.now()+ timezoneOffset - desiredOffset); } // -6 小时是中央时区 console.log("时间是:" + getCurrentDateByOffset(-6));
您可以使用一个名为 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
希望它有用
这在 React Native Application 中对我有用。
import moment from 'moment-timezone'
function convertTZ(date, tzString) {
const formatedDate = moment(date).tz(tzString).format()
return formatedDate
}
export {convertTZ}
这应该适用于每个人。您可以通过在机器上手动更改时间来测试不同的时区。此功能将相应调整。
function getCurrentTime() {
const d = new Date() //2022-07-22T16:27:21.322Z
const t = d.getTime(); //d in milliseconds 1658507241322
const offset = -d.getTimezoneOffset()/60 //current offset in hours -4
const curretMilli = t + (offset * 3600000) //cuuret local time milliseconds need to convert offset to milliseconds
return new Date(curretMilli) //converts current local time in milliseconds to a Date //2022-07-22T12:27:21.322Z
}
当前时区的时区偏移量
date +%s -d '1 Jan 1970'
对于我的 GMT+10 时区(澳大利亚),它返回 -36000
快速而肮脏的手动小时更改器和返回:
return new Date(new Date().setHours(new Date().getHours()+3)).getHours()
toLocaleString
,但随后非常错误地显示将该字符串传递回Date
构造函数。那是自找麻烦。日期字符串解析器不需要接受特定于区域设置的格式,并且输入将被视为在本地时区中。不要那样做。只需使用第一个toLocalString
调用的字符串输出。.toLocaleString(...)
部分可以,其余部分不行。