计算两个日期相隔多少年,多少月,多少天

核心方法
	/**
     * @name: 计算两个日期相隔多少年,多少月,多少天
     * @param {date} $date1 [格式如:2011-11-5]
     * @param {date} $date2 [格式如:2012-12-01]
     * @author: Turbo
     * @Date: 2023-01-05 13:35:37
     */    
    public function diffDate($date1, $date2)
    {
        if (strtotime($date1) > strtotime($date2)) {
            $tmp = $date2;
            $date2 = $date1;
            $date1 = $tmp;
        }
        list($Y1, $m1, $d1) = explode('-', $date1);
        list($Y2, $m2, $d2) = explode('-', $date2);
        $Y = $Y2 - $Y1;
        $m = $m2 - $m1;
        $d = $d2 - $d1;
        if ($d < 0) {
            $d += (int)date('t', strtotime("-1 month $date2"));
            $m--;
        }
        if ($m < 0) {
            $m += 12;
            $Y--;
        }
        // 如果天数大于等于结束日月份天数
        $end_month_start_day = date('Ym01', strtotime($date2));
        $end_month_end_day = date('Ymd', strtotime("{$end_month_start_day} + 1 month -1 day"));
        $end_month_day = range($end_month_start_day, $end_month_end_day, 1);
        if ($d >= count($end_month_day)) {
            $m = $m + 1;
            $d = $d - count($end_month_day);
        }

        return array('year' => $Y, 'month' => $m, 'day' => $d);
    }
调用
$res = $this->diffDate('2022-01-05', '2023-01-05');
dump($res);die;

在这里插入图片描述

以下是一段用C语言计算两个日期相隔数的代码,来自引用[2]: ```c #include<stdio.h> int main() { int n; scanf("%d", &n); while(n--) { int year; int month1, month2, day1, day2; scanf("%d-%d-%d", &year, &month1, &day1); scanf("%d-%d-%d", &year, &month2, &day2); if(month1 == month2) printf("%d\n", day2 - day1 + 1); else { int sum1 = 0; switch(month1 - 1) { case 11: sum1 += 30; case 10: sum1 += 31; case 9: sum1 += 30; case 8: sum1 += 31; case 7: sum1 += 31; case 6: sum1 += 30; case 5: sum1 += 31; case 4: sum1 += 30; case 3: sum1 += 31; case 2: if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) sum1 += 29; else sum1 += 28; case 1: sum1 += 31; } sum1 += day1; int sum2 = 0; switch(month2 - 1) { case 11: sum2 += 30; case 10: sum2 += 31; case 9: sum2 += 30; case 8: sum2 += 31; case 7: sum2 += 31; case 6: sum2 += 30; case 5: sum2 += 31; case 4: sum2 += 30; case 3: sum2 += 31; case 2: if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) sum2 += 29; else sum2 += 28; case 1: sum2 += 31; } sum2 += day2; printf("%d\n", sum2 - sum1 + 1); } } return 0; } ``` ### 代码解析 1. **输入部分**: - 首先通过`scanf("%d", &n);`读取一个整数`n`,它代表要计算日期对的数量。 - 接着使用`while(n--)`循环,对每一对日期进行处理。 - 在循环内部,使用`scanf("%d-%d-%d", &year, &month1, &day1);`和`scanf("%d-%d-%d", &year, &month2, &day2);`分别读取两个日期的年、、日信息,这里假设两个日期是同一年。 2. **日期计算部分**: - **同情况**:如果`month1`等于`month2`,说明两个日期在同一个,直接用`day2 - day1 + 1`计算相隔数并输出。 - **不同情况**: - 对于第一个日期,使用`switch`语句计算从当年11日到该日期的总数`sum1`。从`month1 - 1`开始,根据不同份累加数,对于2,会根据是否为闰年(`year % 4 == 0 && year % 100 != 0 || year % 400 == 0`)来决定是28还是29。最后加上该日期的`day1`。 - 对于第二个日期,同样使用`switch`语句计算从当年11日到该日期的总数`sum2`。 - 最后用`sum2 - sum1 + 1`计算两个日期相隔数并输出。 3. **输出部分**: - 通过`printf("%d\n", ...);`输出计算得到的相隔数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值