我正在尝试将 DD-MM-YYYY 中的日期(从日期选择器字段中获得)转换为 DD/MM/YYYY
这可以使用简单的替换来完成:
'21-04-2014'.replace(/-/g,'/'); // 21/04/2014
并得到两者之间的差异(以年为单位)
你想怎么做?年可以有 365 天或 366 天,应该用哪个?您想要十进制年、年和日、还是年、月和日的答案?
以下函数将计算两个日期之间的差值。如果您使用精确的参数,它不会将天数四舍五入,并将差值精确到毫秒。请注意,它期望得到 Date 对象,而不是字符串。
见下面的 sn-p。
要转换格式为 dd-mm-yyyy 或 dd/mm/yyyy 的字符串,您可以使用:
function parseDMY(s) {
var b = s.split(/\D+/);
return new Date(b[2], --b[1], b[0]);
}
要了解 2012 年 1 月 1 日和 2014 年 7 月 22 日之间的差异:
console.log(dateDifference(parseDMY('1-1-2012'), parseDMY('22-7-2014')));
// [2, 6, 21, 0, 0, "0.000"] or 2 years, 6 months, 21 days
在 2012 年 2 月 29 日至 2014 年 3 月 1 日之间(闰年可能比较棘手):
console.log(dateDifference(parseDMY('29-2-2012'), parseDMY('1-3-2014')));
// [2, 0, 1, 0, 0, "0.000"] or 2 years, 0 months, 1 day
在 2014 年 1 月 31 日至 3 月 1 日之间(31 至 30 天的月份也可能很棘手,只需在 2014 年 1 月 31 日加上一个月就等于 2014 年 3 月 3 日):
console.log(dateDifference(parseDMY('31-1-2014'), parseDMY('1-3-2014')));
// [0, 1, 1, 0, 0, "0.000"] or 0 years, 1 month, 1 day
// Given two date object, return the difference in years, months and days
// Expects start date to be before end date
// Default is to deal in whole days. For precise differences
// (hours, minutes and seconds), set precise to true
function dateDifference(start, end, precise) {
var timeDiff, years, months, days, hours, minutes, seconds;
// Copy date objects so don't modify originals
var s = new Date(+start);
var e = new Date(+end);
// If not precise, set h,m,s to zero
if (!precise) {
s.setHours(0,0,0,0);
e.setHours(0,0,0,0);
}
// Get estimate of year difference
years = e.getFullYear() - s.getFullYear();
// Add difference to start, if greater than end, remove one year
// Note start from restored start date as adding and subtracting years
// may not be symetric
s.setFullYear(s.getFullYear() + years);
if (s > e) {
--years;
s = new Date(+start);
s.setFullYear(s.getFullYear() + years);
}
// Allow for leap year: 29-Feb + 1 year -> 1-Mar
if (start.getDate() != s.getDate()) {
s.setDate(0);
}
// Get estimate of months
months = e.getMonth() - s.getMonth();
months += months < 0? 12 : 0;
// Add difference to start, adjust if greater
s.setMonth(s.getMonth() + months);
if (s > e) {
--months;
s = new Date(+start);
s.setFullYear(s.getFullYear() + years);
s.setMonth(s.getMonth() + months);
}
// Allow for 31 day month rolling over to 1st
if (start.getDate() != s.getDate()) {
s.setDate(0);
}
// Get remaining time difference
timeDiff = e - s;
days = timeDiff / 8.64e7 | 0;
hours = (timeDiff % 8.64e7) / 3.6e6 | 0;
minutes = (timeDiff % 3.6e6) / 6e4 | 0;
seconds = ((timeDiff % 6e4) / 1e3).toFixed(3);
return [years, months, days, hours, minutes, seconds];
}
// Simple date string parser, doesn't validate values
function parseDMY(s) {
var b = s.split(/\D/)
return new Date(b[2], b[1]-1, b[0]);
}
function calcDiff(el) {
var form = el.form;
var start = parseDMY(form.startDate.value);
var end = parseDMY(form.endDate.value);
if (isNaN(start) || isNaN(end)) return;
var diff = dateDifference(start, end);
document.getElementById('output').innerHTML = diff[0] + ' year' + (diff[0] == 1? ' ' : 's ') +
diff[1] + ' month' + (diff[1] == 1? ' ' : 's ') +
diff[2] + ' day' + (diff[2] == 1? '' : 's');
}
<form id="f">
<table>
<tr><td>Start date (d/m/y)<td><input name="startDate" value="20/03/2016">
<tr><td>End date (d/m/y)<td><input name="endDate" value="20/04/2017">
<tr><td><input type="reset"><td><input type="button" onclick="calcDiff(this)" value="Get difference">
</table>
</form>
<div id="output"></div>
这对于闰年仍有一些问题,正在更新中……