Moment.js - 获取两个生日的年月日差值
Moment.js - Get difference in two birthdays in years, months and days
我正在寻找一种使用 momentjs 解析两个日期以显示差异的方法。
我想要它的格式:"X years, Y months, Z days"。
多年来,moment 库和模运算符运行良好。但就目前而言,这是另一个故事,因为我不想自己处理闰年之类的事情。到目前为止,我脑子里的逻辑是:
var a = moment([2015, 11, 29]);
var b = moment([2007, 06, 27]);
var years = a.diff(b, 'years');
var months = a.diff(b, 'months') % 12;
var days = a.diff(b, 'days');
// Abit stuck here as leap years, and difference in number of days in months.
// And a.diff(b, 'days') returns total number of days.
return years + '' + months + '' + days;
您可以获得年份差异并将其添加到初始日期;然后得到月份的差异并将其再次添加到初始日期。
这样一来,您现在可以轻松获得天数差异,同时避免使用取模运算符。
var a = moment([2015, 11, 29]);
var b = moment([2007, 06, 27]);
var years = a.diff(b, 'year');
b.add(years, 'years');
var months = a.diff(b, 'months');
b.add(months, 'months');
var days = a.diff(b, 'days');
console.log(years + ' years ' + months + ' months ' + days + ' days');
// 8 years 5 months 2 days
我不知道有更好的内置方法来实现这一点,但这种方法似乎很有效。
Moment.js 也有 duration
对象。片刻定义为单个时间点,而持续时间定义为基本上您想要的时间长度。
var a = moment([2015, 11, 29]);
var b = moment([2007, 06, 27]);
var diffDuration = moment.duration(a.diff(b));
console.log(diffDuration.years()); // 8 years
console.log(diffDuration.months()); // 5 months
console.log(diffDuration.days()); // 2 days
@Josh 的建议可能有效,但绝对不是计算 2 时刻差异的正确方法。
以上解决方案不适用于 momentjs 2.19.1
然后参考 Date of Joining calculation not working with moment 2.19.1 我已经使用 momentjs 2.19.1.
的最新解决方案实现了新的解决方案
需要的 npm 包:
"moment": "^2.19.4",
"moment-duration-format": "^1.3.0",
"react-moment": "^0.6.8",
在 reactjs 中导入以下内容:
import moment from "moment";
import Moment from "react-moment";
import momentDurationFormatSetup from "moment-duration-format";
var DOJ = moment([work_data.joining_date]).format("YYYY,MM,DD");
var today = moment().format("YYYY,MM,DD");
var totalMonths = parseInt(moment(today).diff(moment(DOJ), 'months'));
var totalDuration = moment.duration(totalMonths, "months").format();
if(totalDuration.search('1y') > -1) {
totalDuration = totalDuration.replace("1y", "1 Year,");
} else {
totalDuration = totalDuration.replace("y", " Years,");
}
if(totalDuration.search('1m') > -1){
totalDuration = totalDuration.replace("1m", "1 Month");
} else {
totalDuration = totalDuration.replace("m", " Months");
}
console.log(totalDuration);
这是另一个答案。使用年龄计算器验证
function calculateAge(){
ageText = jQuery("#dob").closest(".form-group").find(".age-text");
ageText.text("");
level2.dob = jQuery("#dob").val();
if(!level2.dob) return;
level2.mdob= moment(level2.dob, 'DD-MM-YYYY');
if(!level2.mdob.isValid()){
alert("Invalid date format");
return;
}
level2.targetDate = moment();//TODO: Fill in the target date
level2.months = level2.targetDate.diff(level2.mdob, 'months'); // Calculate the months
let years = parseInt(level2.months/12); // A year has 12 months irrespective or leap year or not
let balanceMonths = level2.months%12; // The balance gives the number of months
let days;
if(!balanceMonths){ // If no balance months, then the date selected lies in the same month
months = 0; // so months = 0
days = level2.targetDate.diff(level2.mdob, 'days'); // only the days difference
}else{
months = balanceMonths;
dob_date = level2.mdob.date();
target_month = level2.targetDate.month();
construct_date = moment().month(target_month).date(dob_date);
days = level2.targetDate.diff(construct_date, 'days')+1; // There might be one day missed out. Not sure on UTC
}
ageText = years +" years " + months+ " months " + days +" days";
}
我刚刚将 转换为函数并添加了 小时、分钟 和 秒也是。
function diffYMDHMS(date1, date2) {
let years = date1.diff(date2, 'year');
date2.add(years, 'years');
let months = date1.diff(date2, 'months');
date2.add(months, 'months');
let days = date1.diff(date2, 'days');
date2.add(days, 'days');
let hours = date1.diff(date2, 'hours');
date2.add(hours, 'hours');
let minutes = date1.diff(date2, 'minutes');
date2.add(minutes, 'minutes');
let seconds = date1.diff(date2, 'seconds');
console.log(years + ' years ' + months + ' months ' + days + ' days ' + hours + '
hours ' + minutes + ' minutes ' + seconds + ' seconds');
return { years, months, days, hours, minutes, seconds};
}
使用这个
var totalDays = endDate.diff(startDate, "days");
此处提供的所有解决方案对于某些测试用例均失败。所以我对接受的答案做了一些修改。
function getYMD(date1, date2) {
const a = moment(date1);
const b = moment(date2);
var years = a.diff(b, 'year');
b.add(years, 'years');
const noOfDaysInb = b.daysInMonth();
const noOfDaysIna = a.daysInMonth();
let months = 0;
if (noOfDaysInb > noOfDaysIna) {
months = b.diff(a, "months");
a.add(months, "months");
} else {
months = a.diff(b, 'months');
b.add(months, 'months');
}
var days = a.diff(b, 'days');
return {
years: Math.abs(years),
months: Math.abs(months),
days: Math.abs(days),
}
}
这是我能想到的最佳答案。
我正在寻找一种使用 momentjs 解析两个日期以显示差异的方法。
我想要它的格式:"X years, Y months, Z days"。
多年来,moment 库和模运算符运行良好。但就目前而言,这是另一个故事,因为我不想自己处理闰年之类的事情。到目前为止,我脑子里的逻辑是:
var a = moment([2015, 11, 29]);
var b = moment([2007, 06, 27]);
var years = a.diff(b, 'years');
var months = a.diff(b, 'months') % 12;
var days = a.diff(b, 'days');
// Abit stuck here as leap years, and difference in number of days in months.
// And a.diff(b, 'days') returns total number of days.
return years + '' + months + '' + days;
您可以获得年份差异并将其添加到初始日期;然后得到月份的差异并将其再次添加到初始日期。
这样一来,您现在可以轻松获得天数差异,同时避免使用取模运算符。
var a = moment([2015, 11, 29]);
var b = moment([2007, 06, 27]);
var years = a.diff(b, 'year');
b.add(years, 'years');
var months = a.diff(b, 'months');
b.add(months, 'months');
var days = a.diff(b, 'days');
console.log(years + ' years ' + months + ' months ' + days + ' days');
// 8 years 5 months 2 days
我不知道有更好的内置方法来实现这一点,但这种方法似乎很有效。
Moment.js 也有 duration
对象。片刻定义为单个时间点,而持续时间定义为基本上您想要的时间长度。
var a = moment([2015, 11, 29]);
var b = moment([2007, 06, 27]);
var diffDuration = moment.duration(a.diff(b));
console.log(diffDuration.years()); // 8 years
console.log(diffDuration.months()); // 5 months
console.log(diffDuration.days()); // 2 days
@Josh 的建议可能有效,但绝对不是计算 2 时刻差异的正确方法。
以上解决方案不适用于 momentjs 2.19.1
然后参考 Date of Joining calculation not working with moment 2.19.1 我已经使用 momentjs 2.19.1.
的最新解决方案实现了新的解决方案需要的 npm 包:
"moment": "^2.19.4",
"moment-duration-format": "^1.3.0",
"react-moment": "^0.6.8",
在 reactjs 中导入以下内容:
import moment from "moment";
import Moment from "react-moment";
import momentDurationFormatSetup from "moment-duration-format";
var DOJ = moment([work_data.joining_date]).format("YYYY,MM,DD");
var today = moment().format("YYYY,MM,DD");
var totalMonths = parseInt(moment(today).diff(moment(DOJ), 'months'));
var totalDuration = moment.duration(totalMonths, "months").format();
if(totalDuration.search('1y') > -1) {
totalDuration = totalDuration.replace("1y", "1 Year,");
} else {
totalDuration = totalDuration.replace("y", " Years,");
}
if(totalDuration.search('1m') > -1){
totalDuration = totalDuration.replace("1m", "1 Month");
} else {
totalDuration = totalDuration.replace("m", " Months");
}
console.log(totalDuration);
这是另一个答案。使用年龄计算器验证
function calculateAge(){
ageText = jQuery("#dob").closest(".form-group").find(".age-text");
ageText.text("");
level2.dob = jQuery("#dob").val();
if(!level2.dob) return;
level2.mdob= moment(level2.dob, 'DD-MM-YYYY');
if(!level2.mdob.isValid()){
alert("Invalid date format");
return;
}
level2.targetDate = moment();//TODO: Fill in the target date
level2.months = level2.targetDate.diff(level2.mdob, 'months'); // Calculate the months
let years = parseInt(level2.months/12); // A year has 12 months irrespective or leap year or not
let balanceMonths = level2.months%12; // The balance gives the number of months
let days;
if(!balanceMonths){ // If no balance months, then the date selected lies in the same month
months = 0; // so months = 0
days = level2.targetDate.diff(level2.mdob, 'days'); // only the days difference
}else{
months = balanceMonths;
dob_date = level2.mdob.date();
target_month = level2.targetDate.month();
construct_date = moment().month(target_month).date(dob_date);
days = level2.targetDate.diff(construct_date, 'days')+1; // There might be one day missed out. Not sure on UTC
}
ageText = years +" years " + months+ " months " + days +" days";
}
我刚刚将
function diffYMDHMS(date1, date2) {
let years = date1.diff(date2, 'year');
date2.add(years, 'years');
let months = date1.diff(date2, 'months');
date2.add(months, 'months');
let days = date1.diff(date2, 'days');
date2.add(days, 'days');
let hours = date1.diff(date2, 'hours');
date2.add(hours, 'hours');
let minutes = date1.diff(date2, 'minutes');
date2.add(minutes, 'minutes');
let seconds = date1.diff(date2, 'seconds');
console.log(years + ' years ' + months + ' months ' + days + ' days ' + hours + '
hours ' + minutes + ' minutes ' + seconds + ' seconds');
return { years, months, days, hours, minutes, seconds};
}
使用这个
var totalDays = endDate.diff(startDate, "days");
此处提供的所有解决方案对于某些测试用例均失败。所以我对接受的答案做了一些修改。
function getYMD(date1, date2) {
const a = moment(date1);
const b = moment(date2);
var years = a.diff(b, 'year');
b.add(years, 'years');
const noOfDaysInb = b.daysInMonth();
const noOfDaysIna = a.daysInMonth();
let months = 0;
if (noOfDaysInb > noOfDaysIna) {
months = b.diff(a, "months");
a.add(months, "months");
} else {
months = a.diff(b, 'months');
b.add(months, 'months');
}
var days = a.diff(b, 'days');
return {
years: Math.abs(years),
months: Math.abs(months),
days: Math.abs(days),
}
}
这是我能想到的最佳答案。