我正在用JavaScript将日期字符串转换为Unix时间戳。
这是我得到的:
2015年8月26日--1440561600
我应该得到什么:
2015年8月26日--1440547200
这显然是因为GMT没有设置为0。所以基本上我的时间是
2015年8月26日星期三格林尼治标准时间04:00:00
真正应该转换的时间:
2015年8月26日星期三00:00:00 GMT
那么,在使用Date.getTime() / 1000
之前,我如何取消约会中的GMT?
我在这个网站上尝试了很多方法,但都没有成功。注意:我不想使用Moment.js之类的库或其他任何东西。请告诉我。
我认为您希望解析一个日期字符串,如2015年8月26日,时区为UTC+0000,即2015-08-26T00:00Z。最好的方法是正确格式化字符串并使用可靠的解析器。
然而,如果你要解析字符串以重新格式化它,你还可以在做的时候创建一个Date
由于ECMA-262不支持该格式,因此无法使用Date构造函数或Date.parse自信地解析字符串,因此请使用库或简单函数。
没有时区的日期字符串通常被解析为本地,即假设主机系统时区(除了ECMAScript中,不同的是,ISO 8601日期(如"2017-01-20")被视为UTC)。
要获得日期,就好像字符串被解析为UTC一样,请将其解析为本地,然后减去时区偏移量。ECMAScript时区的含义与ISO8601相反:东为-ve,西为+ve。
请注意,Date对象只是一个时间值,它们从主机获得时区偏移。以下操作时间值,而不是其他操作(即它不会在任何呼吸中"设置"时区)。
例如
/* Parse a date in format August 26,2015 as local
** @param {string} s - string to parse in MMMM DD, YYYY format
** @returns {Date}
*/
function parseMdy(s) {
var months = 'jan feb mar apr may jun jul aug sep oct nov dec'.split(' ');
var b = s.split(/W/);
var month = months.indexOf(b[0].toLowerCase().substr(0,3));
return new Date(b[2], month, b[1]);
}
// Parse as local
var d = parseMdy('August 26,2015');
console.log('Local date time : ' + d.toString());
// Subtract timezone
d.setMinutes(d.getMinutes() - d.getTimezoneOffset());
console.log('Adjusted to +0000: ' + d.toISOString());
console.log('UNIX time value : ' + (d/1000|0));
由于ECMAScript解析的古怪规范,如果日期是按照ISO8601格式化的,那么内置的解析器会将其视为UTC(但这仍然有些不可靠):
// August 26,2015 formatted as 2015-08-26
var d = new Date('2015-08-26');
console.log(d.toISOString());
console.log(d/1000|0);