如何将javascript日期转换为特定的时区

How to convert javascript date to a particular timezone

本文关键字:时区 转换 javascript 日期      更新时间:2023-09-26

我以毫秒为单位获得日期信息。我能正确地解析它。但是当我改变我的电脑时区,解析时间也改变了。

Time in millisec: 1461645900000
Actual Parsed: 26-Apr-2016 10:15:00 IST

当pc时区改变时,它变成:Tue Apr 26 2016 14:15:00 GMT+0930 (Local Standard Time)

这里我只想要实际时间。如何得到它?

这是我的小尝试:

function parseDateTime(dt, format) {
    var months = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
            "Sep", "Oct", "Nov", "Dec" ];
    var ret = "";
    if (dt) {
    var day="",month="",year="",hour="",mins="",secs="";
        var d = new Date(dt)
        var os=d.getTimezoneOffset();
        if(os<0){
        }
        ret += d.getDate() + "-" + months[parseInt(d.getMonth())] + "-"
                + d.getFullYear() + " " + leftPad(d.getHours(), 2, "0") + ":"
                + leftPad(d.getMinutes(), 2, "0") + ":"
                + leftPad(d.getSeconds(), 2, "0");
    }
    document.getElementById("d1").innerHTML=ret;
    console.log(ret);
}
function leftPad(number, targetLength, withWhat) {
    var output = number + '';
    while (output.length < targetLength) {
        output = withWhat + output;
    }
    return output;
}
parseDateTime(1461645900000);

我用过新的日期()。toLocaleString("en-US", {timeZone: "}),但受限制。我也不感兴趣的新lib。

你对时间表示时间之间的区别感到困惑。只有一次1461645900000。宇宙中到处都是一样的。这是一个神奇的时刻,恒星以某种方式排列,宇宙处于其发展的一个特殊点。

时区是表示日期的函数。如果我住在东京,我可能更喜欢用东京时间看我的时间。如果我住在加州,我可能更喜欢用加州时间看我的时间。这样的本地时间表示由本地时间和UTC的偏移量组成,因此可以正确解释。

当你在JS中打印或输出一个日期时,它通常被转换成一个字符串,当然,这个字符串作为一种表示,必须相对于地球上的某个地方——换句话说,相对于一些偏移量。默认的JS行为是使用你现在所在位置的偏移量,就像你在本地计算机上设置的那样。这就是为什么如果你的电脑设置为印度时间,你会看到类似于"2016年4月26日星期二10:15:00 GMT+0530(印度标准时间)"的内容。你也可以尝试date.toISOString,它会给你"2016-04-26T04:45:00.000Z"("Z"表示UTC),或者date.toUTCString,它会忽略你的本地时区,并给出相对于UTC的时间,如"Tue, 26 Apr 2016 04:45:00 GMT"。

为了完整起见,人们经常混淆偏移量时区。时区是一个特定区域的所有偏移量(可以改变,例如在DST的情况下)随时间变化的完整历史记录。实际上有数百个不同的时区,包括印第安纳州的一个小镇在1929年取消了夏时制。如果希望管理时区数据,则必须将其与时间本身分开处理。即使您碰巧有一个偏移量,也没有办法唯一地从偏移量到时区—例如,加利福尼亚和智利是不同的时区,但都是偏移量-08:00。要正确地管理时区,您将不得不使用某种特殊的时区包。

我经常听到人们说他们"想要改变时区"。你不能改变时间的时区。时间本身没有时区,它们只是宇宙时钟上的时间。您可以做的是更改时间的表示,以便与特定的偏移量相对。例如,您可以尝试使用date.toLocaleString。你觉得它有什么"局限性"?

> new Date().toLocaleString("en-US", {timeZone: "America/Los_Angeles", timeZoneName: "long"})
< "11/3/2016, 8:33:02 AM Pacific Daylight Time"

您也可以使用timeZoneName: "short",这将产生"PDT"。但是,"PDT"或"PST"或"IST"或其他任何东西都不能用作timeZone选项的值,因为这些三个字母的缩写不是唯一的。例如,"PST"也可以表示"皮特凯恩标准时间"。

您尝试的格式,将timeZone作为空字符串,将不起作用(产生一个未识别的时区错误)。

如果你想给一个字符串,如"IST",该怎么办?如上所述,这是行不通的;你必须找到一种方法将"IST"映射到"亚洲/加尔各答",这将需要某种图书馆。如果你想指定某种偏移量呢?这里,您需要某种库,它可以从偏移量推断出时区。

底线是,如果您发现自己正在解析日期,调整这个或那个组件,并使用字符串算法将其拼凑在一起,那么您正在做一些错误或不必要的事情。

我理解你想要得到相同的时间,而不管时区,当你通过毫秒。

而不是下面两行

    var d = new Date(dt)
    var os = d.getTimezoneOffset();

包含以下行

    var os = new Date()
    os = os.getTimezoneOffset();
    var d = new Date((dt + (os * 60 * 1000)));

这将根据您的本地时区调整毫秒到UTC时间,并从调整后的UTC时间创建date对象,这样您将始终获得相同的时间,无论您的本地时区如何。

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

首先创建您的日期的date对象(new date())并转换。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString

给定:

时间单位:毫秒:1461645900000

如果您使用

创建日期
new Date(1461645900000);

则该值被视为从1970-01-01T00:00:00Z开始的毫秒偏移量,并且表示与主机系统设置无关的同一时刻。当您将其写成字符串时:

实际解析日期:26apr -2016 10:15:00 IST

则使用主机系统时区设置从UTC时间值创建"本地"日期和时间值。IST是UTC+05:30,所以等效的UTC日期为:

2016-04-26T04:45:00Z

如果你将你的电脑时区更改为具有不同偏移量的时区,那么你当然会看到不同的"本地"时间,但是日期的内部时间值没有改变,它所代表的时刻也没有改变。因此,当您更改到UTC+09:30的偏移量时,"本地"时间晚了4小时,并且您得到:

2016年4月26日星期二14:15:00 GMT+0930(当地标准时间)

所以当你说:

这里我只想要实际时间。如何得到它?

表示该时间点在该时区的实际时间,即

26-Apr-2016 10:15:00 IST (UTC+0530)
Tue Apr 26 2016 14:15:00 GMT+0930
2016-04-26T04:45:00Z

是同一时刻的不同表示。

如果您想要表示特定时区中的任何日期,您可以使用UTC方法将UTC时间调整为所需的偏移量,然后使用UTC方法获取要显示的日期和时间值。