我在JavaScript中将日期字符串转换为Unix时间戳。
这是我得到的:
2015年8月26日 - 1440561600
我应该得到什么:
2015年8月26日 - 1440547200
这显然是因为GMT没有设置为0.所以基本上我的时间是周三,2015年8月26日04:00:00 GMT
真正应该转换时:
周三,2015年8月26日00:00:00 GMT
那么在我使用Date.getTime() / 1000
之前,如何在我的约会时摆脱GMT呢?
我在这个网站上尝试了很多方法,但没有一个方法有效。注意:我不想使用像Moment.js或其他任何东西的库。请告诉我。
答案 0 :(得分:0)
我认为您要解析日期字符串,如2015年8月26日,时区为UTC + 0000,即2015-08-26T00:00:00Z。最好的方法是正确格式化字符串并使用可靠的解析器。
但是,如果您要解析字符串以重新格式化它,您也可以在执行此操作时创建日期。
由于ECMA-262不支持该格式,因此无法使用Date构造函数或Date.parse自信地解析字符串,因此请使用库或简单函数。
没有时区的日期字符串通常被解析为本地字符串,即假设主机系统时区(ECMAScript除外,只是为了区别,ISO 8601日期如" 2017-01-20"被视为UTC)。
要获取日期,就好像字符串被解析为UTC一样,将其解析为local,然后减去时区偏移量。 ECMAScript时区与ISO 8601具有相反的意义:东是-ve,西是+ ve。
请注意,Date对象只是一个时间值,它们从主机获得时区偏移量。以下操作时间值,没有别的(即它不会"设置"任何重复的时区)。
e.g。
/* 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解析的古怪规范,如果按ISO 8601格式化日期,那么内置解析器会将其视为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);