У меня есть две строки даты, которые нужно преобразовать в объекты Date.

Вот мой подход:

var d1 = "{{demand.event_mindate}}";
var d2 = "{{demand.event_maxdate}}";

var max_date = new Date(d1);
var min_date = new Date(d2);

Вот результат моего вызова alert():

d1 -> 29 mars 2016
d2 -> 29 avril 2016

Проблема в том, что преобразование min_date в объект Date работает, но не работает для max_date. После преобразования я получаю неверную дату.

Может ли кто-нибудь помочь мне с этой проблемой?

0
user3232446 2 Мар 2016 в 17:01
Как вы связываете demand.event_mindate? Как выглядит вводимая строка даты?
 – 
Mr. Polywhirl
2 Мар 2016 в 17:14
Это язык шаблонов Django. когда я печатаю ad1 и d2, я напечатал d1, но d2 получил неверную дату.
 – 
user3232446
2 Мар 2016 в 19:17

1 ответ

Лучший ответ

Если вы протестируете все французские месяцы, все, кроме февраля, мая, июня, июля, августа и декабря, будут проанализированы правильно. Это связано с тем, что первые ТРИ (3) символа правильно анализируются в течение месяцев, которые начинаются с тех же букв, что и их английский эквивалент. Просто случайно названия похожи. См. Таблицу ниже.


Самый простой способ решить эту проблему синтаксического анализа строки даты на основе локали - использовать такую ​​библиотеку, как MomentJS .

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

Для краткости я взял так называемый "вывод" и использовал его в качестве ввода. Пока вы не уточните, как выглядит ваш ввод, для решения проблемы должно быть достаточно следующего.

moment.locale('fr'); // Load French
var frenchMonths = ('janvier,février,mars,avril,mai,juin,' +
                    'juillet,août,septembre,octobre,novembre,décembre').split(',');

generateRows(document.getElementById('date-table'), frenchMonths.map(function(month) {
  return '29 ' + month + ' 2016'; // Format the month name into a valid date-string
}), function(dateString) {
    return [
      dateString,
      new Date(dateString),
      moment(dateString, 'DD MMMM YYYY').toDate()
    ];
});

function generateRows(table, data, fn) {
  return appendChildren(table, data.map(function() {
    return createRow(fn.apply(null, arguments))
  }));
}
function createRow(data) {
  return appendChildren(document.createElement('tr'), data.map(function(value) {
    return createCell(value);
  }));
}
function createCell(value) {
  var td = document.createElement('td');
  td.innerHTML = new String(value).substring(0, 34);
  if (value instanceof Date && !isValidDate(value)) td.className = 'invalid';
  return td;
}
function appendChildren(parent, nodes) {
  for (var i = 0; i < nodes.length; i++) { parent.appendChild(nodes[i]); }
  return parent;
}
function isValidDate(date) {
  if (Object.prototype.toString.call(date) === '[object Date]') {
    return !isNaN(date.getTime()); // d.valueOf() could also work
  } else {
    return false;
  }
}
body {
  font-family: Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,sans-serif;
  font-size: 0.8em;
}
table, tr, th, td {
  border-collapse: collapse;
  border: thin solid #000;
}
.invalid {
  color: #F00;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.11.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.11.2/locale/fr.js"></script>

<table id="date-table">
  <thead>
    <tr>
      <th>Input</th>
      <th>Output - Date Casting</th>
      <th>Output - MomentJS Parse</th>
    </tr>
  </thead>
  <tbody></tbody>
</table>

Если вам нужно узнать о форматировании для MomentJS, ознакомьтесь с руководством по форматированию.


Обновить

Я считаю, что это то, о чем говорил RobG:

var months = 'janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre'.split(',');
function parseDate(datestring, months, expression, matchFn) {
  return matchFn.apply(null, expression.exec(datestring).map(function(value) {
    return !isNaN(value) ? parseInt(value, 10) : value;
  }));
}

var date = parseDate('29 avril 2016', months, /(\d{1,2}) (\w+) (\d{4})/, function(dateString, day, month, year) {
  return new Date(year, months.indexOf(month), day);
});

document.body.innerHTML = date.toString();
1
Community 23 Май 2017 в 15:31
Спасибо за ваш ответ. но почему d1 работает, а d2 нет? d1 imonth на французском!
 – 
user3232446
2 Мар 2016 в 19:21
@ user3232446: Не могли бы вы дать мне фактический ввод для d1 и d2? Я предполагаю, что это объекты / строки даты Python ... Тогда я могу только определить, что может быть не так.
 – 
Mr. Polywhirl
2 Мар 2016 в 19:32
D1: 29 марта 2016 года, а d2: 29 августа 2016 года. Я не могу понять, почему D1 работает, а d2 нет! Да это питон
 – 
user3232446
2 Мар 2016 в 20:32
@ user3232446: Я обновил свой ответ. Я заметил, что названия месяцев, начинающиеся с тех же трех букв, что и их английский эквивалент, разбираются правильно. Внутренний механизм синтаксического анализа даты должен попытаться сопоставить первые три символа, прежде чем решить, действителен ли данный месяц.
 – 
Mr. Polywhirl
2 Мар 2016 в 21:32
Спасибо за ваше объяснение. Это была проблема !! это работает сейчас спасибо много
 – 
user3232446
2 Мар 2016 в 22:19