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

在Typescript中解析iso8601微秒

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

    我需要解析时间戳 ISO 8601 以微秒为单位。我不想失去精确性。我需要解析以便能够向查询添加过滤。

    支持微秒的数据库会创建这些时间戳,因此我不必担心在没有足够精度的环境中创建这些时间戳。但是数据库可以改变,所以我希望有一个通用的解析器,可以处理有或没有微秒的时间戳。 如果我使用 Date 我失去了微秒级的精度。

    1 回复  |  直到 6 年前
        1
  •  1
  •   snorberhuis    6 年前

    我创建了自己的班级 PrecisionDate 它存储一个与日期相同的毫秒数,但以微秒计的小数部分。它使用 new Date() 精确到毫秒。然后,我使用regex和capture组来获取微秒。

    const ISO8601_REGEX = /^(\d{4})-(0\d|1[0-2])-([0-2]\d|3[0-1])T([01]\d|2[0-4]):([0-5]\d):([0-5]\d)[.,](\d{3})?(\d{3})?(\d+)?\+(\d\d):(\d\d)/;
    
    public static parse(timestamp: string): number {
        // Get the full time except for the microseconds
        let time = Date.parse(timestamp);
    
        const captureGroups = ISO8601_REGEX.exec(timestamp);
        const microSeconds = captureGroups[ISO8601_REGEX_MICRO];
    
        if (microSeconds) {
            time += parseInt(microSeconds, 10) / 1000;
        }
    
        return time;
    }