Разобрать микросекунды ISO 8601 в Typescript - PullRequest
0 голосов
/ 02 октября 2018

Мне нужно проанализировать метку времени в ISO 8601 с микросекундами.Я не хочу терять точность.Мне требуется синтаксический анализ, чтобы иметь возможность добавить фильтрацию к запросам.

База данных, которая поддерживает микросекунды, создает эти временные метки, поэтому мне не нужно беспокоиться о создании их в среде, которая не обладает достаточной точностью.Но база данных может измениться, поэтому я хочу иметь универсальный синтаксический анализатор, который может обрабатывать метки времени без микросекунд или без них.Если я использую Date, я теряю микросекундную точность.

1 Ответ

0 голосов
/ 04 октября 2018

Я создал свой собственный класс PrecisionDate, который хранит число с миллисекундами точно так же, как Date, но с дробной частью для микросекунд.Он анализирует метку времени, используя new Date() с точностью до миллисекунды.После этого я использую регулярное выражение и группу захвата, чтобы получить микросекунды.

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;
}
...