在JavaScript中将日期转换为另一个时区

在JavaScript中将日期转换为另一个时区,javascript,timezone,Javascript,Timezone,我正在寻找一个功能转换日期在一个时区到另一个 它需要两个参数 日期(格式为“2012/04/10 10:10:30+0000”) 时区字符串(“亚洲/雅加达”) 时区字符串如中所述 有什么简单的方法可以做到这一点吗?不知羞耻地从: 此函数通过提供城市/国家名称和偏移值来计算时区值非常有用好的,找到了 我正在使用。代码如下: var dt = new timezoneJS.Date("2012/04/10 10:10:30 +0000", 'Europe/London'); dt.setTim

我正在寻找一个功能转换日期在一个时区到另一个

它需要两个参数

  • 日期(格式为“2012/04/10 10:10:30+0000”)
  • 时区字符串(“亚洲/雅加达”)
时区字符串如中所述

有什么简单的方法可以做到这一点吗?

不知羞耻地从:

此函数通过提供城市/国家名称和偏移值来计算时区值非常有用

好的,找到了

我正在使用。代码如下:

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
对于用户,现在可以使用。使用它,您的函数将如下所示:

function toTimeZone(time, zone) {
    var format = 'YYYY/MM/DD HH:mm:ss ZZ';
    return moment(time, format).tz(zone).format(format);
}
支持带参数的函数,较旧的浏览器通常会忽略参数

const str=new Date();
console.log(str)明白了

想要强制显示的日期=服务器日期,无需修改本地设置(UTC)

我的服务器是GMT-6-->新日期()。getTimezoneOffset()=360


我不知道有什么简单的方法可以将日期对象转换为任何时区,但如果您想将其转换为本地时区,可以使用
date.prototype.getTime()
将其转换为相应的毫秒数,然后再转换回来

date = new Date('2016-05-24T13:07:20');
date = new Date(date.getTime());
例如,
date.getHours()


我已经了解到,各种datetime函数在某些浏览器中可能表现出非标准行为,所以请先测试一下。我可以确认它在Chrome中工作

有一个名为'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"
  ]
}
你可以在这里找到它:


希望它有用

设置一个变量,用“-”符号分隔年、月和日,加上一个“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 );

您也可以尝试将日期时区转换为印度:

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);

我应该注意到,我只能使用哪些外部库。moment.js和timezone js不是我的选择

我拥有的js日期对象是UTC格式的。我需要在一个特定的时区(在我的例子中是“美国/芝加哥”)获取从这个日期开始的日期和时间

UTC目前领先“美国/芝加哥”6小时。输出为:

currentUtcTime: 11/25/2016
currentUtcTime Hour: 16
currentUtcTime Minute: 15

currentDateTimeCentralTimeZone: 11/25/2016
currentDateTimeCentralTimeZone Hour: 10
currentDateTimeCentralTimeZone Minute: 15

如果你只需要转换时区,我已经上传了一个功能最低的。其~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());

熟悉Java8
java.time
package或
joda time
的人可能会喜欢新来的孩子:图书馆

安装

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>

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#模式的静态方法
var zonedDateTime=j.zonedDateTime.parse(模式的dateStr,j.DateTimeFormatter.of('yyyy/MM/dd HH:MM:ss xx');
var Adjusted zonedDateTime=zonedDateTime.With ZonesAMEInstant(j.ZoneId.of(‘美国/纽约’);
log(zonedDateTime.toString(),'=>',adjustedZonedDateTime.toString());
//2012-04-10T10:10:30Z=>2012-04-10T06:10:30-04:00[美国/纽约]
在真正的java本质中,它是相当详细的lol。但是,作为一个移植的java库,特别是考虑到他们移植了1800年的测试用例,它也可能工作得非常准确


计时操纵很难。这就是为什么许多其他库在边缘情况下存在缺陷。Moment.js似乎正确地设置了时区,但我看到的其他js库,包括
timezone js
,似乎不可信

当前时区的时区偏移量

date +%s -d '1 Jan 1970'

对于我的GMT+10时区(澳大利亚),它返回-36000

如果您不想导入一些大型库,您可以使用它将日期对象转换为不同的时区

//指定时区是导致转换的原因,其余的只是格式化
常量选项={
年份:两位数,月份:两位数,日期:两位数,
小时:“两位数”,分钟:“两位数”,秒:“两位数”,
时区:“亚洲/雅加达”,
时区名称:“短”
}
常量格式化程序=新的Intl.DateTimeFormat('sv-SE',选项)
施工开始日期=新日期(“2012/04/10 10:10:30+0000”)
const dateInNewTimezone=formatter.format(开始日期)

console.log(dateInNewTimezone)//12-04-10 17:10:30 GMT+7
我最近在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”或任何有用的东西


如果第一个参数是您的语言环境时区,第二个参数是您的目标时区,它将返回具有正确偏移量的日期对象

我在使用时遇到问题。我添加这个答案只是为了让其他人面对同样的问题。因此,我有一个日期字符串
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.
现在,我想通过执行以下操作将其转换为特定时区:

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.

您可以使用ToLocalString()方法设置时区

new Date().toLocaleString('en-US', { timeZone: 'Indian/Christmas' })
对于印度,您可以使用“Indian/Christmas”,以下是不同的时区

"Antarctica/Davis",
    "Asia/Bangkok",
    "Asia/Hovd",
    "Asia/Jakarta",
    "Asia/Phnom_Penh",
    "Asia/Pontianak",
    "Asia/Saigon",
    "Asia/Vientiane",
    "Etc/GMT-7",
    "Indian/Christmas"

在浏览了很多内容(包括本页的链接)后,我发现了这篇很棒的文章,使用矩时区:

总结一下:

获取用户的时区

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(tz).format('ddd, Do MMMM YYYY, h:mma');
moment.utc('2016-12-25 07:00').tz('America/Los_Angeles').format('ddd, Do MMMM YYYY, h:mma');
moment.tz('2016-12-25 07:00', 'America/Los_Angeles').tz('Europe/London').format( 'ddd, Do MMMM YYYY, h:mma' );
return new Date(new Date().setHours(new Date().getHours()+3)).getHours()
$(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;
        }


    });
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"