【问题标题】:Converting Date to GMT 0 for accuracy将日期转换为 GMT 0 以确保准确性
【发布时间】:2017-01-21 08:49:05
【问题描述】:

我正在将日期字符串转换为 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 之类的库或其他任何东西。请告诉我。

【问题讨论】:

  • 请在此处或 Google 中搜索 UTC JavaScript。这里有重复的重复
  • 我有,但没有一个工作!我刚刚尝试了另一个建议使用 new Date().getTimezoneOffset() 并乘以 60 以获得以毫秒为单位的差异,然后减去原始日期 .... 仍然不起作用。你能花几秒钟写一个有效的例子吗?我相信这对你来说是小菜一碟。
  • 不。不是小菜一碟,我仍然不确定您到底想要什么 - 有 UTC 和 ISO 日期。这不是重复的吗? stackoverflow.com/questions/9756120/…
  • @JohnNoob - 你从另一个答案中描述的被称为“时代转移”,如果你这样做,你必须非常小心,通常你不想完全这样做。让我们感到困惑的是,您并不清楚您的输入到底是什么以及如何解释它。你的意思是你有一个字符串 "August 26, 2015" 这样的?如果是这样,你的意思是让我们假设你打算在那天推断00:00 UTC?这很好,但你应该这样陈述而不是做出这样的假设。此外,恕我直言,如果您正在处理整个日期,那么 unix 时间是一个糟糕的选择。

标签: javascript date timezone unix-timestamp


【解决方案1】:

我认为您想解析一个日期字符串,例如 2015 年 8 月 26 日,时区为 UTC+0000,即 2015-08-26T00:00:00Z。最好的方法是正确格式化字符串并使用可靠的解析器。

但是,如果您要解析字符串以重新格式化它,您还可以在执行此操作时创建一个 Date。

由于 ECMA-262 不支持该格式,因此您无法自信地使用 Date 构造函数或 Date.parse 解析字符串,因此请为此使用库或简单函数。

没有时区的日期字符串通常被解析为本地时区,即假设主机系统时区(除了在 ECMAScript 中,不同之处在于,像“2017-01-20”这样的 ISO 8601 日期被视为 UTC)。

要获得一个日期,就像字符串被解析为 UTC 一样,请将其解析为本地,然后减去时区偏移量。 ECMAScript 时区与 ISO 8601 的含义相反:东是 -ve,西是 +ve。

请注意,日期对象只是一个时间值,它们从主机获取时区偏移量。以下操作时间值,仅此而已(即它不会在任何方面“设置”时区)。

例如

/* 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2018-04-13
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多