获取特定时区的时间

IT技术 javascript date time timezone
2021-01-23 05:50:50

我正在使用 JavaScriptDate类并尝试使用getDate()方法获取当前日期但显然它正在加载系统日期和时间。我正在运行来自印度的代码,但我想使用相同的方法获取英国的日期和时间。我怎样才能做到这一点 ?

6个回答

如果您知道 UTC 偏移量,那么您可以传递它并使用以下函数获取时间:

function calcTime(city, offset) {
    // create Date object for current location
    var d = new Date();

    // convert to msec
    // subtract 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 for city"+ city +" is "+ nd.toLocaleString();
}

alert(calcTime('Bombay', '+5.5'));

取自:将当地时间转换为另一个时间

您实际上需要减去 getTimezoneOffset 输出而不是添加它 - 该偏移量用于从本地时间到 UTC,而不是相反。
2021-03-13 05:50:50
这不是一个好的答案。如果您在偏移量中进行硬编码,如果它有夏令时,您将关闭大约半年。
2021-03-13 05:50:50
请记住,某个位置的偏移量可能会发生变化(夏令时/英国夏令时)。
2021-03-14 05:50:50
是否可以更改格式?例如,我只需要以小时、分钟、秒和 AM/PM 为单位的时间
2021-03-23 05:50:50
你的utc事情错了。d.getTime 已经在UTC毫秒。然而,toLocaleString()您将需要使用.toUTCString()!
2021-04-07 05:50:50

你可以使用Intl.DateTimeFormat.

let options = {
    timeZone: 'Europe/London',
    year: 'numeric',
    month: 'numeric',
    day: 'numeric',
    hour: 'numeric',
    minute: 'numeric',
    second: 'numeric',
  },
  formatter = new Intl.DateTimeFormat([], options);

console.log(formatter.format(new Date()));

或者,如果您只格式化一次而不是批量使用Date.prototype.toLocaleDateString().

(new Date()).toLocaleString([], options)

不幸的是浏览器要求了解比UTC其他时区,所以try这些块,并计算出在情况下,它失败的替代,例如取时区从服务器偏移。

正确答案,它被称为国际 API,并且是内置的,在大多数较新的浏览器中,您应该首先检查它是否存在......自然...... - 参考:Intl
2021-03-13 05:50:50
这非常有效。这是浏览器支持列表:caniuse.com/#search=Intl
2021-03-22 05:50:50
这在 Chrome 中有效,但在 Firefox 中无效。
2021-03-23 05:50:50
适用于 Google 表格应用脚本。
2021-03-24 05:50:50
这在 Safari 中仍然不起作用。
2021-04-02 05:50:50

最好的方法是使用 getLocaleString,如下所示:

创建日期对象:

date = new Date(0)

如果你在柏林,这应该转换成这个字符串:

1970 年 1 月 1 日星期四 01:00:00 GMT+0100 (CET)

获取雅典的时间:

date.toLocaleString('de-DE', {hour: '2-digit',   hour12: false, timeZone: 'Europe/Athens' })

'02'

获取上海时间:

date.toLocaleString('de-DE', {hour: '2-digit',   hour12: false, timeZone: 'Asia/Shanghai' })

'08'

首先,您应该使用“en-US”,因为它是 Node < 13 中唯一支持的区域设置(即此时 100% 的生产节点使用),但您还需要考虑分钟,因为某些时区有半小时抵消。
2021-03-15 05:50:50
旁注:Date.prototype.toLocaleString仅适用于 IE11+、Firefox 29+、Safari 11+ 等。请看这里
2021-03-29 05:50:50
不仅如此。IANA 时区名称仅适用于 chrome 和 firefox ..
2021-03-30 05:50:50

您可以使用getUTCDate()和相关getUTC...()方法访问基于 UTC 时间的时间,然后进行转换。

如果你愿意,你可以使用valueOf(),它返回自 Unix 时代以来的 UTC 秒数,并使用它,但它可能会涉及更多。

这是获得##的正确方法

function getTime(offset)
        {
            var d = new Date();
            localTime = d.getTime();
            localOffset = d.getTimezoneOffset() * 60000;

            // obtain UTC time in msec
            utc = localTime + localOffset;
            // create new Date object for different city
            // using supplied offset
            var nd = new Date(utc + (3600000*offset));
            //nd = 3600000 + nd;
            utc = new Date(utc);
            // return time as a string
            $("#local").html(nd.toLocaleString());
            $("#utc").html(utc.toLocaleString());
        }
此线程中的所有建议方法都没有考虑夏令时(适用的地方),因此最好使用时刻时区库来简化生活。
2021-03-15 05:50:50
@AbandonedCart 答案对于大多数编程目的来说不够通用,除非它包含如何检索偏移量的答案。这绝不是简单的 - 偏移量可以全年变化,并且在历史上大多数地区至少发生了多次变化。所有这些的数据库很大。
2021-03-15 05:50:50
@AdamLeggett 对几乎任何位置时间的简单 Google 搜索在专有结果中都有 UTC+/-#,因此假设 OP 无法完成如此简单的任务有点不公平。
2021-03-16 05:50:50
投反对票,因为答案希望 OP 知道偏移量。据推测,OP 正在从时区字符串工作,尽管他对此并不明确。OP 需要使用 Intl API,或者像 Luxon 或 Moment 这样的库。
2021-04-04 05:50:50
如果您想知道如何调用此函数,那么这里是一个示例,如果您想为 India getTime(5.5) 获取时间;
2021-04-11 05:50:50