代码之家  ›  专栏  ›  技术社区  ›  BeeBee8

如何在Javascript中不使用破折号(-)和冒号(:)从ISO日期字符串获取日期对象

  •  0
  • BeeBee8  · 技术社区  · 6 年前

    我正在将ICS转换为JSON,但它以如下格式给了我日期 "20190103T073640Z"

    我知道有很多答案 “如何将ISO字符串转换为日期对象”

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

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

    但是如何在javascript中从这样的日期字符串中获取日期对象而不使用破折号和冒号呢 “20190103T073640Z” ??

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

    谢谢

    1 回复  |  直到 6 年前
        1
  •  2
  •   Anders Carstensen    6 年前

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

    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);
        2
  •  0
  •   Thomas    4 年前

    如果使用库是合理的(在其他日期操作的情况下),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 })