#javascript #node.js #unit-testing #date #devtools
#javascript #node.js #модульное тестирование #Дата #devtools
Вопрос:
Сегодня я писал модульный тест для этой функции:
/**
* recives a timestamp and format to 'yyyy/mm/dd hh:mm'
*/
function formatCurrentDate(date) {
return Intl.DateTimeFormat('ja-JP',
{
hour: '2-digit',
minute: '2-digit',
year: 'numeric',
month: '2-digit',
day: '2-digit'
}).format(date);
}
с помощью этого теста:
test('it should format the current date', () => {
expect(formatCurrentDate(new Date().getTime())).toMatch(new RegExp(/^d{4}/d{2}/d{2}s{1}d{2}:d{2}$/));
});
но всегда происходит сбой, потому что узел возвращает мне другой формат даты
итак, я только что понял, что, запустив formatCurrentDate()
devtools, я получил правильный формат: ‘2020/08/25 14: 50’
но когда я запускаю ту же функцию в своем cmd (набираю node и вставляю функцию), я получаю: ‘2020-08-25 14:50’
почему это происходит??
Ответ №1:
Intl.DateTimeFormat пытается обеспечить форматирование компонентов даты с учетом культурных особенностей на основе языкового кода. Не существует окончательной спецификации или стандарта для сопоставления языковых кодов с форматами, это зависит от реализации. Кроме того, если определенный язык не поддерживается, реализация может вернуться к формату по умолчанию. Таким образом, разные реализации вполне могут предоставлять разные форматы для одного и того же языкового кода и опций.
Так что не стоит полагаться на Intl.DateTimeFormat для форматирования даты и ожидания, что она будет иметь точный формат. Вы могли бы использовать методformatToParts, чтобы получить соответствующие части, а затем вручную поместить их в нужный вам формат.
Если вам нужен определенный формат, вам следует создать его вручную с помощью специальной функции или библиотеки форматирования, которую вы можете написать самостоятельно или использовать одну из многих доступных в Интернете. В stackoverflow уже есть много вопросов и ответов по этой теме.
PS. Полезно публиковать код в виде доступного для выполнения фрагмента, например
/**
* recives a timestamp and format to 'yyyy/mm/dd hh:mm'
*/
function formatCurrentDate(date = new Date()) {
return Intl.DateTimeFormat('ja-JP',
{
hour: '2-digit',
minute: '2-digit',
year: 'numeric',
month: '2-digit',
day: '2-digit'
}).format(date);
}
console.log(formatCurrentDate());