如何告诉JavaScript日期从哪里获取TimezoneOffset?

时间:2016-06-28 13:39:35

标签: javascript node.js date datetime timezone

我使用new Date(<date-string>)然后.getTime()将日期字符串从1970年开始传递到毫秒。

问题是日期字符串不包含它们的时区。他们是英国人,所以时区将是GMT或GMT + 1,具体取决于日期......

当我在前端(Chrome)或后端(Node.js)中使用此技术时。所采用的时区是英国的(GMT或GMT + 1取决于日期)。我认为这是从操作系统中获取的。

但是,当使用我被告知的Node.js服务器配置为UTC时...时区总是GMT,导致英国夏令时出错。

有没有办法告诉Date在不更改服务器配置的情况下从操作系统中获取时区?

示例:

var aDate = new Date('2016-06-23 10:15:0');
var timestamp = aDate.getTime();

以防我的解释不明确:

// Executed on 28-06-2016

// In the browser (in London)
new Date().getTimezoneOffset();                            // -60
new Date('28-06-2016 11:11:11').getTimezoneOffset();       // -60
new Date('28-01-2016 11:11:11').getTimezoneOffset();       // 0

// In the Node.js server I am forced to use, which is configured to use UTC
new Date().getTimezoneOffset();                            // 0
new Date('28-06-2016 11:11:11').getTimezoneOffset();       // 0
new Date('28-01-2016 11:11:11').getTimezoneOffset();       // 0

// Ideally, I would like to have the output I get in the browser when I run the code in the UTC Node.js server

2 个答案:

答案 0 :(得分:2)

我建议使用Moment Timezone来实现这一点,因为如果没有库,这将是不必要的复杂。要从给定时区中的给定日期获得UTC(以毫秒为单位),您可以执行以下操作:

const moment = require('moment-timezone');

function londonTimeToUTC(dateString) {
  return moment.tz(dateString, 'DD-MM-YYYY HH:mm:ss', 'Europe/London').valueOf();
}

console.log(londonTimeToUTC('28-06-2016 11:11:11')); // 1467108671000
console.log(londonTimeToUTC('28-01-2016 11:11:11')); // 1453979471000

传递给moment.tz()的第二个参数是format string,如果日期字符串不在ISO format中,则必须使用timezone identifier。第三个参数是任何有效的{{3}}。

答案 1 :(得分:2)

  

有没有办法告诉Date在不改变服务器配置的情况下从操作系统中获取时区?

来自操作系统的时区是 Date对象使用的时区。如果您在不更改配置的情况下询问是否可以更改该时区,那么不 - 没有办法做到这一点。 Date对象始终采用本地时区的行为。即使您在输入字符串中提供偏移量,它也只是使用它来确定内部UTC时间戳。通过大多数属性(包括toStringgetTimezoneOffset)的输出将始终使用本地时区。

即使在您的示例中,您也不能指望浏览器行为始终返回您显示的值,只是因为访问您网站的每个用户可能都有不同的时区设置。

建议的处理方法是使用moment.js库,它可以自己处理UTC和本地时间,但如果你想使用moment-timezone extension,可能需要使用How to initialize javascript date to a particular timezone特定时区,例如Europe/London

现在,话虽如此,如果您确定整个node.js应用程序将在单个时区运行,并且您在Linux或OSX(而不是Windows)上运行,那么您确实可以更改哪个时间node.js认为是“本地”的区域。只需在启动节点之前设置TZ环境变量,如下所示:

env TZ='Europe/London' node server.js

浏览器或Windows没有等效内容。而且您仍然需要在您的网站上与可能的非英国用户竞争 - 因此这并不能保证客户端和服务器时间之间的匹配。但它确实解决了你的问题。

另见: