Почему моя дата клонируется на 1 час в моих тестах Travis CI - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть функция, которая возвращает объект Date, модифицированный дельтой, например:

    export function getDate(delta: string = "", start?: Date): Date {
        const date = start ? new Date(start.getTime()) : new Date();
        const rel = delta.split(" ").join("");
        const [, sign, years, months, days, hours, mins, secs] = toArray(/([+-])?(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?/.exec(rel) as ArrayLike<string>);
        const plus = sign !== "-"; 
        if (years) date.setFullYear(date.getFullYear() + (plus ? +years : -years));
        if (months) date.setMonth(date.getMonth() + (plus ? +months : -months));
        if (days) date.setDate(date.getDate() + (plus ? +days : -days));
        if (hours) date.setHours(date.getHours() + (plus ? +hours: -hours));
        if (mins) date.setMinutes(date.getMinutes() + (plus ? +mins: -mins));
        if (secs) date.setSeconds(date.getSeconds() + (plus ? +secs : -secs));
        return date;
    }

Кажется, что он отлично работает в узлах и хроме, и мои тесты проходят локально.Но когда я нажимаю на npm, тесты в Travis CI терпят неудачу, например: Travis CI

К чему я, к сожалению, не обращаю внимания, - почему первый тестовый проход и второй провал ровно через 1 час,Есть ли какая-то магия CET / UCT, которую мне не хватает?Не упускаю ли я что-то особенное из-за того, как работает объект Date в различных версиях узла?

Вы можете увидеть тестовый код в travis (ссылка выше), но я добавлю его и здесь:

    const now = new Date();
    let pos = Util.getDate("+1Y2M3d4h5m6s", now);
    expect(now.getTime() - pos.getTime()).toBe(-37166706000); // passes locally and in travis
    let neg = Util.getDate("-1Y2M3d4h5m6s", now);
    expect(now.getTime() - neg.getTime()).toBe(36903906000); // passes locally but fails in travis

Благодарен за мудрость.

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Проверяя различия в метках времени в миллисекундах, когда ваш ввод «сейчас», вы предполагаете, что все ваши устройства всегда будут иметь одинаковое количество связанных миллисекунд. Это неверно.

  • Не каждый год имеет одинаковое количество дней. Обычные годы имеют 365. Високосные годы имеют 366.
  • Не каждый месяц имеет одинаковое количество дней. Они варьируются от 28 до 31.
  • Не каждый местный день имеет 24 часа. Переходы смещения часового пояса (например, вызванные переходом на летнее время или изменениями стандартного времени) могут привести к тому, что данный местный день будет иметь длину 23, 23,5, 24, 24,5 или 25 часов.

Поскольку вы работаете по местному времени, вы будете зависеть от местного часового пояса. Я предполагаю, что одна из ваших сред имеет переход на часовой пояс в пределах диапазона, который вы тестируете, а другая - нет.

Существуют и другие проблемы с подходом, который вы используете для применения интервала. Подумайте, была ли введенная дата 2019-01-31 и интервал был +1M1d. Возможно, вы ожидаете, что это будет 2019-03-01, но ваш код выдаст 2019-03-04 из-за переполнения, которое происходит при применении каждого шага. Код, позволяющий сделать это правильно, сложен и обычно делегируется библиотекам, таким как Moment , Luxon и Date-fns .

1 голос
/ 17 апреля 2019

В каком часовом поясе работает система Travis CI?Мой часовой пояс не распознает летнее время, и я получаю тот же результат, что и Travis CI.Поскольку вы пересекаете границу часового пояса (по крайней мере, в США, в настоящее время наступает апрель, а вы возвращаетесь в февраль), поведение будет отличаться в зависимости от того, распознает ли часовой пояс летнее время или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...