我使用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
答案 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时间戳。通过大多数属性(包括toString
和getTimezoneOffset
)的输出将始终使用本地时区。
即使在您的示例中,您也不能指望浏览器行为始终返回您显示的值,只是因为访问您网站的每个用户可能都有不同的时区设置。
建议的处理方法是使用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没有等效内容。而且您仍然需要在您的网站上与可能的非英国用户竞争 - 因此这并不能保证客户端和服务器时间之间的匹配。但它确实解决了你的问题。
另见: