Метка времени интерпретируется по-разному на локальной машине и на конвейере gitlab - PullRequest
2 голосов
/ 30 марта 2020

У меня есть следующий код для преобразования метки времени в текстовый формат.

export default function convertTime(time) {
    let date = new Date(time);
    let year = date.getFullYear();
    let month = date.getMonth() + 1;
    let day = date.getDate();
    let hours = date.getHours();
    let minutes = "0" + date.getMinutes();
    return day + "." + month + "." + year + " " + hours + ':' + minutes.substr(-2);
}

, и мой тест с использованием jest следующий:

import convertTime from "../../ ../src/components/Base/TimeConverter";

describe("Test time converter", function () {
    it("Time converter should return valid string for a certain hard coded time stamp in milliseconds", function () {
        const result = convertTime(1585575410 * 1000);
        const expected_result = "30.3.2020 15:36";
        expect(result).toBe(expected_result);
    });
});

на моем компьютере тест проходит:

lara@dirk:~/Desktop/git/JS/kiwi$ npm run test

> kiwi@0.1.0 test /home/lara/Desktop/git/JS/kiwi
> env-cmd -f .env.dev jest --passWithNoTests

 PASS  tests/components/Base/TestTimeConverter.spec.js
 PASS  tests/others/TestEnvironmentVariables.spec.js

Test Suites: 2 passed, 2 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        1.349s
Ran all test suites.

однако на gitlab он не проходит:

$ npm run test
 > kiwi@0.1.0 test /builds/kiwi4/frontend
 > env-cmd -f .env.dev jest --passWithNoTests
 PASS tests/others/TestEnvironmentVariables.spec.js
 FAIL tests/components/Base/TestTimeConverter.spec.js
   ● Test time converter › Time converter should return valid string for a certain hard coded time stamp in milliseconds
     expect(received).toBe(expected) // Object.is equality
     Expected: "30.3.2020 15:36"
     Received: "30.3.2020 13:36"
       5 |         const result = convertTime(1585575410 * 1000);
       6 |         const expected_result = "30.3.2020 15:36";
     > 7 |         expect(result).toBe(expected_result);
         |                        ^
       8 |     });
       9 | });
       at Object.<anonymous> (tests/components/Base/TestTimeConverter.spec.js:7:24)
 Test Suites: 1 failed, 1 passed, 2 total
 Tests:       1 failed, 1 passed, 2 total

У меня вопрос почему?

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

Экземпляр бегуна GitLab и ваш компьютер имеют разные часовые пояса.

Цитата из dzone.com

Когда вы вызываете метод getTime для объекта Date, вы получаете количество миллисекунд от Unix эпоха. Хотя ваш текущий объект Date сохраняет время с некоторым смещением, getTime дает секунды в UT C. Помните об этом при создании меток времени, если вы не живете на нулевом меридиане.

var currentDate = selectedDate;          

var currentTime = currentDate.getTime(); 

Это довольно неловкое, неожиданное и не интуитивное поведение, но вы должны помнить, что все вычисления даты и времени должны использовать В то же время система, чтобы дать соответствующие результаты.

Вам нужно будет получить атрибуты в UT C часовой пояс ИЛИ рассчитать смещение часового пояса с помощью:

new Date(timestamp + (offset * 1000))

И вы можете рассчитать смещение вашего клиента с:

const offset = new Date().getTimezoneOffset();
1 голос
/ 30 марта 2020

Могу поспорить, что вы находитесь где-то в часовом поясе центрального США, а gitlab - в Pacifi c. Ваш тест чувствителен к часовому поясу. (Подсказка: когда время не совпадает ровно на несколько часов, обычно это проблема часового пояса.)

Javascript 's Date такие методы, как .getFullYear() по своей природе чувствительны к настройке часового пояса. Такие методы, как .getUTCFullYear(), не являются.

Вы можете организовать запуск nodejs с установленной переменной среды TZ, чтобы она не принимала локальное значение по умолчанию. Вам нужно сделать это в своем конвейере, чтобы этот тест прошел.

 env TZ='UTC' node yourcommand

Или вы можете попробовать поместить эту строку js прямо в начало вашего теста.

 process.env.TZ = 'UTC'
...