获取下一次生日还有多少天(TS+dayjs)

注意:需要用到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请及时联系笔者

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值