将日期字符串转换为日期对象

Convert date-string to Date object

本文关键字:日期 对象 字符串 转换      更新时间:2023-09-26

我有两个日期字符串想要转换为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。转换后我收到无效的日期。

任何人都可以帮助我解决这个问题吗?

如果您测试所有法语月份,则除 2 月、5 月、6 月、7 月、8 月和 12 月之外的所有月份都会被正确解析。这是因为前三 (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();