如何告诉JavaScript日期从哪里乘坐TimeZoneOffset



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

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

当我在前端(Chrome)或后端(node.js)中使用此技术时。所采用的时区是英国人(GMT或GMT 1,具体取决于日期)。我认为这是从OS中取的。

但是,当使用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

我建议对此使用Moments 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()是格式字符串,如果日期字符串不使用ISO格式,则是必要的。第三个参数是任何有效的时区标识符。

有什么方法可以告诉Date从操作系统中获取时区而不更改服务器配置?

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

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

建议处理此问题的推荐方法是使用MONK.JS库,它可以单独处理UTC和本地时间,但如果您想使用特定时区域工作,例如Europe/London

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

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

浏览器或Windows没有等效的。而且,您仍然必须与网站上可能的非UK用户抗衡 - 因此,这不能保证客户端和服务器时间之间的匹配。但这确实解决了您的问题。

另请参见:

  • 如何初始化JavaScript日期至特定时区
  • 如何将日期的时区用于UTC
  • 如何在node.js中设置默认时区

相关内容

  • 没有找到相关文章

最新更新