求一个计算离自己生日的代码片段?

比如生日26,就显示今天是您生日,错过了 就计算来年多少天

阅读 2.1k
3 个回答

计算下一个生日很简单,两个日期减一下换算下就行了,其实主要就是校验格式吧,如果要写一个比较完整的实现需要考虑比较多,日期格式应该要支持传入如:2022-11-262022/11/262022.11.2611-262022年11月26日...等等各式各样的格式,还有日期的准确性,比如2-30这种,还有如果传入了年份可能还要再加上闰年的逻辑。最核心最难的就是校验入参,计算反倒非常简单,下面只是一个示例,并没有考虑较多的场景,仅供参考

function distanceOfNextBirthday(date) {
    var arr = date.split(/\D/);
    if(arr.length>2) arr.shift(); // 去除年份
    var month = arr[0] - 1;
    var day = arr[1]|0;
    if(arr.length != 2 || month<0 || month>11 || day<1 || day > 31) return '无效入参';

    var now = new Date();
    now.setHours(0)
    now.setMinutes(0)
    now.setSeconds(0)
    now.setMilliseconds(0)
    var next = new Date(now.getFullYear() + (month < now.getMonth() || (month == now.getMonth() && day < now.getDate()) ? 1 : 0), month, day);
    var distance = (next - now)/24/60/60/1000;
    return distance ? '距离下一次生日还有' + distance + '天' : '今天是您生日';
}

PS:对于校验其实讨巧一点可以通过尝试补全格式然后直接调用new Date(),看是否能够创建正确时间来校验

new Date('2022-02-30').toString() === 'Invalid Date'// true 

直接用 dayjs 就行,里面有一个 diff 的API,然后就把你输入的生日去设置一下年份做对比就行了。比如说

import dayjs from 'dayjs'
function getDistance2Birthday(date){
  // 原始生日
  const birthday = dayjs(date)
  // 当前时间
  const today = dayjs()
  // 今年生日
  const curYaerBirthday = birthday.set('year', today.get('year'))
  // 今年岁数
  const curAge = today.diff(birthday,'year')
  // 差距天数
  const diffDate = today.diff(curYaerBirthday, 'day')
  let msg = `距离您的${curAge}岁生日还有${Math.abs(diffDate)}天。`
  if(diffDate === 0) msg = `🎉生日快乐,今天是${birthday.format('M月D日')},您的${curAge}岁生日。`
  if (diffDate > 0) msg = `距离您的${curAge}岁生日已经过去了${diffDate}天。`
  return msg
}

getDistance2Birthday('2000-11-26')
// '🎉生日快乐,今天是11月26日,您的22岁生日。'
getDistance2Birthday('2000-12-26')
// '距离您的21岁生日还有29天。'
getDistance2Birthday('2000-10-26')
// '距离您的22岁生日已经过去了31天。'

粗略的写了一下,日期没有做校验,也没有没有考虑 2月29日 的情况。
这种特殊日期的生日我没过过不知道是非闰年就过 28 号这样的。

你都可以自己扩展写一下,都是很简单的。

相关阅读

Difference · Day.js

// 计算两个时间差 dateBegin 开始时间
function timeFn(dateBegin) {
  //如果时间格式是正确的,那下面这一步转化时间格式就可以不用了
  var dateEnd = new Date();//获取当前时间
  var dateDiff = dateEnd.getTime() - dateBegin;//时间差的毫秒数
  var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000));//计算出相差天数
  var leave1=dateDiff%(24*3600*1000)  //计算天数后剩余的毫秒数
  var hours=Math.floor(leave1/(3600*1000))//计算出小时数
  //计算相差分钟数
  var leave2=leave1%(3600*1000)  //计算小时数后剩余的毫秒数
  var minutes=Math.floor(leave2/(60*1000))//计算相差分钟数
  //计算相差秒数
  var leave3=leave2%(60*1000)   //计算分钟数后剩余的毫秒数
  var seconds=Math.round(leave3/1000)
  var leave4=leave3%(60*1000)   //计算分钟数后剩余的毫秒数
  var minseconds=Math.round(leave4/1000)
  var timeFn = "耗时:"+dayDiff+"天 "+hours+"小时 "+minutes+" 分钟"+seconds+" 秒"+minseconds+"毫秒";
  return timeFn;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题