JS: new Date () не принимает строку даты в моей собственной локали (д / м / г) - PullRequest
10 голосов
/ 23 августа 2011

Мой браузер (т.е. моя ОС) должен знать, что я нахожусь в Австралии, и какой правильный формат даты. В этом случае д / м / год, а не м / д / год. Однако, если я запускаю следующий код:

alert(new Date("21/11/1968"))

Результат - «Четверг, 11 сентября 1969 года». Он думает, что месяц приходит первым и корректируется соответствующим образом.

Почему это? Является ли ответом всегда использовать универсальный формат в качестве функций ввода данных или есть способ сообщить браузеру, что следует ожидать ввода даты в моем формате локали?

Ответы [ 3 ]

16 голосов
/ 23 августа 2011

Довольно просто преобразовать строку даты в формат, который даст ожидаемый результат ('гггг / мм / дд' или 'гггг-мм-дд'):

new Date("21/11/1968".split('/').reverse().join('/'));

[ edit ] Вам может понравиться этот более общий метод (часть библиотеки npm PureHelpers ):

document.querySelector("#result").textContent = `
  tryParseDate("2017/03/22", "ymd"); // ${tryParseDate("2017/03/22", "ymd")}
  tryParseDate("03/22/2017", "mdy"); // ${tryParseDate("03/22/2017", "mdy")}
  tryParseDate("22-03-2017", "dmy"); // ${tryParseDate("22-03-2017", "dmy")}
`;

function tryParseDate(dateStringCandidateValue, format = "dmy") {

  if (!dateStringCandidateValue) {
      return null;
  }
  
  const mapFormat = format.split("").reduce(function(a, b, i) {
      a[b] = i;
      return a;
  }, {});
  const dateStr2Array = dateStringCandidateValue.split(/[ :\-\/]/g);
  const datePart = dateStr2Array.slice(0, 3);
  const datePartFormatted = [
    +datePart[mapFormat.y], 
    +datePart[mapFormat.m] - 1, 
    +datePart[mapFormat.d]
  ];
  
  if (dateStr2Array.length > 3) {
    dateStr2Array.slice(3).forEach(t => datePartFormatted.push(+t));
  }
  
  const dateTrial = new Date(Date.UTC.apply(null, datePartFormatted));
  return dateTrial && dateTrial.getFullYear() === datePartFormatted[0] &&
          dateTrial.getMonth() === datePartFormatted[1] &&
          dateTrial.getDate() === datePartFormatted[2] 
      ? dateTrial 
      : null;
}
10 голосов
/ 23 августа 2011

Объект Date очень слабый. Вы не можете сказать, какой формат ожидать. Вы можете создать его с помощью строки в m / d / y, как вы указали, или new Date(year, month, day[, hours, seconds, milliseconds]);

8 голосов
/ 07 ноября 2012

новая дата (string_date) поддерживает следующие форматы даты:

  1. ММ-дд-гггг
  2. YYYY / ММ / дд
  3. ММ / дд / гггг
  4. ММММ дд, гггг
  5. МММ дд, гггг
...