我正在使用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时间戳。通过大多数属性(包括toString
和getTimezoneOffset
)输出将始终使用本地时区。
即使在示例中,您也无法指望浏览器行为总是返回所显示的值,仅仅是因为访问您网站的每个用户可能都有不同的时区域设置。
建议处理此问题的推荐方法是使用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中设置默认时区