将日期转换为GMT 0以确保准确性



我正在用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);

相关内容

  • 没有找到相关文章

最新更新