我有两个想要转换为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 :(得分:1)
如果您测试所有法国月份,则除了2月,5月,6月,7月,8月和12月之外的所有月份都会被正确解析。这是因为第一个三(3)个字符被正确解析了几个月,这些字母以与英语等价物相同的字母开头。名字相似的只是偶然。请参阅下表。
解决基于区域设置解析日期字符串的问题的最简单方法是使用MomentJS等库。
如果您需要使用其他语言解析日期,则可以包含所需的语言,也可以包含all languages。
为了简洁起见,我带了所谓的"输出" ,并将其用作输入。在您澄清输入内容之前,以下内容应足以解决问题。
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;
}
}
&#13;
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;
}
&#13;
<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>
&#13;
如果您需要了解MomentJS的格式,请查看formatting guide。
我相信这就是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();
&#13;