如何从 Javascript 中没有破折号 (-) 和冒号 (:) 的 ISO 日期字符串获取日期对象

How to get Date object from ISO Date string without dash(-) and colon(:) in Javascript

我正在将 ICS 转换为 JSON,但它给了我 "20190103T073640Z" 格式的日期,如何从 Javascript 中的此字符串获取日期对象?

我知道 "how to convert ISO string to date object" 有很多答案,但这个字符串缺少破折号和冒号。

例如 当我添加破折号和冒号时,它会正确给出输出

new Date("2019-01-03T07:36:40Z");

但是如何从像这样没有破折号和冒号的日期字符串中获取 javascript 中的日期对象 "20190103T073640Z"

为认为重复的人编辑 - 我有 ICalendar 文件,我正在使用在线转换器将其转换为 JSON,因此我使用的转换器给出的日期格式不是我可以直接传递给 new Date() 的格式从中获取日期对象。那么有没有什么方法可以像这样解析“20190103T073640Z”字符串。

谢谢。

提取每个日期组件,并使用普通构造函数创建一个新的 Date 对象怎么样?

function parseIcsDate(icsDate) {
  if (!/^[0-9]{8}T[0-9]{6}Z$/.test(icsDate))
    throw new Error("ICS Date is wrongly formatted: " + icsDate);
  
  var year   = icsDate.substr(0, 4);
  var month  = icsDate.substr(4, 2);
  var day    = icsDate.substr(6, 2);
  
  var hour   = icsDate.substr(9, 2);
  var minute = icsDate.substr(11, 2);
  var second = icsDate.substr(13, 2);
  
  return new Date(Date.UTC(year, month - 1, day, hour, minute, second));
}

var date = parseIcsDate("20190103T073640Z");
console.log(date);

如果使用库是合理的(在其他日期操作的情况下),Luxon 是一个很好的选择: https://moment.github.io/luxon/

import { DateTime } from 'luxon';

// Creates a DateTime instance from an ISO 8601-compliant string
const date = DateTime.fromISO('2019-01-03T07:36:40Z');

// Format date to ISO 8601 string
// -> '2019-01-03T08:36:40.000+01:00'
date.toISO();

// Set format to 'basic'
// -> '20190103T083640.000+0100'
date.toISO({format: 'basic'});

// We don't need milliseconds
// -> '20190103T083640+0100'
date.toISO({format: 'basic', suppressMilliseconds: true});

// My system uses a time zone with an offset of +01:00, which is used by Luxon as default.
// So I have to convert the date to UTC (offset +00:00).
// -> '20190103T073640Z'
date.toUTC(0).toISO({format: 'basic', suppressMilliseconds: true});

// As an one-liner
DateTime
    .fromISO('2019-01-03T07:36:40Z')
    .toUTC(0)
    .toISO({ format: 'basic', suppressMilliseconds: true })