注意:需要用到dayjs依赖 Day.js中文网
/**
* 输出生日天数
* @param birthdayDate 生日 1966-08-02
*
*/
function computedBirthday(birthdayDate: string) {
let day = daysUntilNextBirthday(birthdayDate)
if (day == 0) {
return '今天生日'
}
if (day == 1) {
return '明天生日'
}
if (day == 2) {
return '后天生日'
}
return `距离下一次生日还有${day}天`
}
/**
* 获取下一次生日是多少天
* @param birthdayDate 生日 1966-08-02
*/
function daysUntilNextBirthday(birthdayDate: string) {
// 获取当前时间
const day = dayjs()
// 获取生日时间
let target = dayjs(birthdayDate + ` ${day.format('HH')}:${day.format('mm')}:${day.format('ss')}`)
let diffDay = 0
// 判断生日月份是否大于当前月份,如果小于说明还没有过生日,如果大于说明已经今年的生日已经过了
if (day.month() > target.month() || (day.month() == target.month() && day.day() > target.day())) {
// 生日已过的下一次生日时间=今天~年末+明年年初~明年生日的那一天
const curYearDays = day.endOf('year').diff(day, 'day')
const nexYearStart = day.add(1, 'year').startOf('year')
const nexYearDays = target.set('year', nexYearStart.year()).diff(nexYearStart, 'day')
diffDay = curYearDays + nexYearDays
} else {
const temp = target.set('year', day.year())
if (temp.isAfter(day)) {
// 生日在今天之后
const birthdayDay = day.set('month', target.month()).set('date', target.date())
diffDay = birthdayDay.diff(day, 'day')
} else {
// 生日在今天之前
const curYearDays = day.endOf('year').diff(day, 'day')
const nexYearStart = day.add(1, 'year').startOf('year')
const nexYearDays = target.set('year', nexYearStart.year()).diff(nexYearStart, 'day')
diffDay = curYearDays + nexYearDays
}
}
if (diffDay < 0) {
diffDay = Math.abs(diffDay)
}
return diffDay
}
极端条件下可能有bug,如有bug请及时联系笔者