获取特定时区的时间

97

我正在使用 JavaScript 的 Date 类,并尝试使用 getDate() 方法获取当前日期。但显然它正在加载系统日期和时间。我正在印度运行代码,但我想使用相同的方法获取英国的日期和时间。我该怎么做?


4
这篇帖子相比于更为详尽的帖子https://dev59.com/tmkw5IYBdhLWcg3wKnab 来说略显逊色,后者提供了更好的答案。简而言之,请使用 https://github.com/mde/timezone-js。 - Brett Hannah
3
执行总结是使用moment.js作为时区-js并不支持夏令时。;-) - nachtigall
9个回答

89

如果您知道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'));

参考来源: 使用JavaScript将本地时间转换为其他时区


16
你的 utc 相关的代码有误。d.getTime() 已经是以 UTC 毫秒为单位的时间了。然而,你需要使用 .toUTCString() 而不是 toLocaleString() - Bergi
58
请记住,一个地点的偏移量可能会改变(夏令时/英国夏令时间)。 - James M
3
你实际上需要减去 getTimezoneOffset 的输出结果,而不是加上它 - 这个偏移量是从本地时间到UTC的转换值,而不是反过来。 - kotekzot
23
这不是一个好的答案。如果你在代码中硬编码偏移量,当使用夏令时时,时间会差大约半年。 - horsejockey
除非你使用亚利桑那时间,否则它不会因夏令时而改变 :-) - user2966445
显示剩余5条评论

88

您可以使用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以外的时区并非必需品,因此在尝试这些代码块时,请考虑到它可能失败的情况,并尝试找到替代方案,例如从服务器获取时区偏移量。


这在Chrome中有效但在Firefox中无效。 - Toast
正确答案是,它被称为国际 API,并且内置在大多数较新的浏览器中,您应该首先检查它是否存在...当然...- 参考:Intl - user257319
这在Safari中仍然不起作用。 - David
8
这个非常非常好用。以下是浏览器支持列表链接:https://caniuse.com/#search=Intl - Joshua Pinter
1
适用于Google Sheets应用脚本。 - jcd
时区列表:https://dev59.com/rloT5IYBdhLWcg3wlwWR#54500197。您可能会对`America/Los_Angeles`和`America/New_York`感兴趣。 - Luke Miles

46

一种方法是使用 getLocaleString,就像这样:

创建一个日期对象:

date = new Date(0)

如果您在柏林,这应该转换为此字符串:

Thu Jan 01 1970 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'

这句话是用单引号括起来的数字 08。

2
附注:Date.prototype.toLocaleString 仅适用于 IE11+、Firefox 29+、Safari 11+ 等浏览器。请参见 此链接 - Raptor
1
不仅如此,IANA时区名称仅在Chrome和Firefox中可用。 - iRaS
首先,您应该使用'en-US',因为它是Node <13中唯一支持的语言环境(即此时生产Node使用的100%),但是您还需要考虑分钟,因为某些时区具有半小时偏移量。 - Tom

6
你可以使用getUTCDate()和相关的getUTC...()方法来访问基于UTC时间的时间,然后进行转换。
如果你愿意,你可以使用valueOf(),它返回自Unix纪元以来,在UTC中表示的秒数,然后使用该值进行计算,但这可能会更加复杂。

4

这是获取 ## 的正确方法

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

5
这个帖子中提到的所有建议都没有考虑夏令时(如果适用),因此最好使用moment时区库来使生活更轻松。 - Irfan Raza
2
因为答案期望OP知道偏移量,所以进行了点踩。大概OP正在使用一个时区字符串,尽管他没有明确说明。OP需要使用Intl API或类似Luxon或Moment的库。 - Adam Leggett
@AdamLeggett 在几乎任何位置进行简单的谷歌搜索都会显示UTC+/-#的专有结果,因此假设OP无法完成这样一个简单任务有些不公平。 - Abandoned Cart
@AbandonedCart 这个答案对于大多数编程目的来说不够通用,除非它包括如何检索偏移量的答案。这绝不是简单的 - 偏移量可能会在一年中变化,并且在历史上大多数地区至少已经改变了几次。所有这些的数据库都很大。 - Adam Leggett
@AdamLeggett 请分享你的答案,但尽量保持简洁高效。 - Abandoned Cart
显示剩余3条评论

1
如果确保拥有正确的日期和时间非常重要,则最好在服务器上运行一个服务(当然是以UTC运行),返回时间。接着,您可以在客户端创建一个新的日期并比较值,必要时根据服务器时间的偏移量调整所有日期。
为什么要这样做?我曾经收到过难以复现的错误报告,因为我无法在服务器日志中找到错误信息,直到我注意到错误报告是在我收到它两天后发送的。您可能可以相信浏览器在发送UTC时间戳时正确处理时区转换,但是您显然不能信任用户已经正确设置他们的系统时钟。(如果用户的时区设置不正确,则没有真正的解决方案;除了在“本地”时间中打印当前服务器时间)

1
在你过于兴奋之前,这篇文章是在2011年写的。
如果我现在要做这个,我会使用Intl.DateTimeFormat。这里有一个链接,让你了解2011年它有什么样的支持
原始答案现在已经(非常)过时了。

Date.getTimezoneOffset()

getTimezoneOffset() 方法返回格林威治标准时间 (GMT) 和本地时间之间的时间差,以分钟为单位。

例如,如果您所在的时区是 GMT+2,则将返回 -120。

注意:此方法始终与 Date 对象一起使用。

var d = new Date()
var gmtHours = -d.getTimezoneOffset()/60;
document.write("The local time zone is: GMT " + gmtHours);
//output:The local time zone is: GMT 11

-1

.getTimezoneOffset() 方法应该可以使用。这将获取您所在时区与 GMT 之间的时间差。然后您可以根据需要进行计算。


-19

客户端的简短回答是:不行,你必须从服务器端获取它。


19
你错了。实际上服务器上更难,因为客户端知道它所在的时区和当地时间,而服务器只有其中一半的信息。 - CommunistPancake
1
这似乎是对OP实际问题的唯一答案。 OP想要英国时间,无论客户位于何处。 您可以获取UTC时间,这是英国的时区,但没有简单的方法确定它是否为夏令时。 - Tim Tisdall
5
UTC不是英国的时区,这是一个常见的误解。UTC没有时区,是标准时间。英国在冬季与UTC相同,在夏季为UTC+1。英国的时区是英国标准时间或英国夏令时(两者都缩写为BST... 这只会增加混淆!) - the_new_mr
对于客户端,我们使用JavaScript。 - Sybghatallah Marwat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接