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

时间:2018-12-26 07:09:20

标签: javascript json icalendar

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

我知道“如何将ISO字符串转换为日期对象” 有很多答案,但是此字符串缺少破折号和冒号。

例如 当我添加破折号和小号时,它可以正确输出

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

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

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

谢谢。

2 个答案:

答案 0 :(得分:1)

仅提取每个日期组件并使用常规构造函数创建一个新的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);

答案 1 :(得分:0)

如果有理由使用图书馆(如果使用其他日期运算),那么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 })