OK! Спасибо за комментарии и ответы. Это подтолкнуло меня в правильном направлении.
set-tz
это круто, но функция cleanup()
не выполнялась после завершения тестов.
Это, в сочетании с tzutil
изменением системного времени Windows, заставило меня задуматься о минимизации влияние изменения часового пояса и возможность вернуться к force вместо того, чтобы полагаться на слушателя выхода.
Итак, вот где он приземлился.
// setTimezone file.
const { execSync } = require('child_process');
const os = require('os');
export const setTimezone = (TZ) => {
if (os.platform() === 'win32') {
process.env.STORED_TZ = execSync('tzutil /g').toString();
execSync(`tzutil /s "${TZ}"`);
console.warn(`Windows timezone changed from "${process.env.STORED_TZ}" to "${TZ}"\nRun \`tzutil /s "${process.env.STORED_TZ}"\` to set it back manually.`);
} else {
process.env.TZ = TZ;
}
};
export const restoreTimezone = () => {
if (os.platform() === 'win32') {
execSync(`tzutil /s "${process.env.STORED_TZ}"`);
console.warn(`Windows timezone restored to "${process.env.STORED_TZ}"`);
} else {
process.env.TZ = process.env.STORED_TZ;
}
};
Вот пример того, где мы его используем.
// test file
import * as dtt from './dateTimeTools';
import typeOf from './funcs/typeOf';
import { restoreTimezone, setTimezone } from './setTimezone';
const inputs = {
dateOnly: '2020-01-01',
dateTimeWithoutTimezone: '2020-01-01T00:00:00.000000',
midnightNewYorkTimezone: '2020-01-01T00:00:00.000000-05:00',
};
describe('dateTimeTools > isoToDate', () => {
setTimezone('Pacific Standard Time'); // ?
assert({
given: 'any valid ISO string.',
should: 'return a date object.',
actual: typeOf(dtt.isoToDate(inputs.dateOnly)),
expected: 'date',
});
assert({
given: 'a date-only ISO string.',
should: 'return the given date at midnight in the local timezone.',
actual: dtt.isoToDate(inputs.dateOnly).toString(),
expected: 'Wed Jan 01 2020 00:00:00 GMT-0800 (Pacific Standard Time)',
});
restoreTimezone(); // ?
});
И вывод.