Intl.Разница в формате DateTimeFormat между узлом и devtools

#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());