【问题标题】:Date conversion in UTC/ISO 8601 formatUTC/ISO 8601 格式的日期转换
【发布时间】:2017-08-17 07:20:27
【问题描述】:

我正在处理日期转换。 我正在将此2017-08-17 13:00:00 日期格式转换为2017-08-17T13:00:00Z

工作示例:

var from_date;
var sdate = new Date( '2017-08-17 13:00:00' );
var utcSDate = sdate.toISOString();
from_date = utcSDate.replace('.000', '');
console.log(from_date);

但是这段代码从13:00:00更改为08:00:00。为什么会这样。任何想法 ? 或者有人给我一个想法,将日期从我的输入转换为如上所述的所需输出。

【问题讨论】:

  • toISOString() 方法转换为 UTC,因此您需要将偏移量添加到您的时间
  • 你能详细说明一下偏移量吗?
  • 是的,我写了一个答案

标签: javascript date datetime datetime-conversion


【解决方案1】:

我建议只替换缺少的部分,而不使用Date 对象,您可以在其中输入当地时间并获取祖鲁时间。

var date = '2017-08-17 13:00:00',
    iso = date.replace(/(.{10}) (.{8})/, '$1T$2.000Z');

console.log(date);
console.log(iso);

【讨论】:

  • 如果输入的日期格式以后改变了怎么办?它将如何将新的日期格式转换为 UTC?
【解决方案2】:

您可以从日期对象中减去偏移量:

var d = new Date();
var offsetInMinutes = d.getTimezoneOffset();
d.setMinutes(d.getMinutes() - offsetInMinutes);
d.toISOString()

【讨论】:

    【解决方案3】:

    但此代码将时间从 13:00:00 更改为 08:00:00。为什么会这样 发生了。任何想法 ?或者有人给我一个想法来转换日期 如上所述,我对所需输出的输入。

    字符串 "2017-08-17 13:00:00" 不是 ECMA-262 支持的格式,因此解析它完全取决于实现,请参阅Why does Date.parse give incorrect results? 如果它被解析为日期,它很可能被视为 ISO 8601 本地,即“2017-08-17T13:00:00”。 Safari 将返回一个无效日期,Firefox 会将其解析为本地日期。

    因此,请始终避免使用内置解析器。

    如果您只想重新格式化字符串,请将其作为字符串进行:

    var s = '2017-08-17 13:00:00';
    console.log(s.replace(' ','T') + 'Z');

    但是,您只需将日期和时间从原来的任何时区更改为 UTC+0000。如果要考虑主机时区偏移量,则应手动将字符串解析为日期(库可以提供帮助,但对于单一格式不是必需的),然后使用 toISOString:

    // Given a string in ISO 8601 like format, parse as local 
    function parseISOLocal(s) {
      var b = s.split(/\D/);
      return new Date(b[0], b[1]-1, b[2], (b[3] || 0),
        (b[4] || 0), (b[5] || 0));
    }
    
    var s = '2017-08-17 13:00:00';
    
    console.log(parseISOLocal(s).toISOString())

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多