两个日期间隔问题,之前问过一次,但是没有满意的答案。

计算两个日期间的天数问题。
学者A去国外求学,假定离开祖国的日子为公元A年B月C日,返回的日子为公元X年Y月Z日。请计算A出国求学的总天数(含离开和返回当天)。
我的思路和代码如下:
首先分两部分来计算,先计算A年1月1日至A年B月C日的天数,然后计算A年1月1日 至 X年1月1日的天数,二者相减就是两日期相隔天数。
请问各位还有没有更简单得算法。


#include <stdio.h>
#include <time.h>

int main()
{
    // 初始化两个日期
    struct tm start_date = {0, 0, 0, 1, 0, 2020};
    struct tm end_date = {0, 0, 0, 28, 1, 2020};
    
    // 将日期转换为秒数
    time_t start_time = mktime( & start_date);
    time_t end_time = mktime( & end_date);

    // 计算两个日期之间的天数
    double diff_days = difftime(end_time, start_time) / 86400.0;

    printf("两个日期之间的天数: %.1lf 天\n", diff_days);
    return 0;
}

如果你想简化代码,可以先计算出离开日期和返回日期的时间戳(以毫秒为单位的 Unix 时间),然后用返回日期的时间戳减去离开日期的时间戳,然后除以 1000(因为 1 秒是 1000 毫秒),再除以 60(因为 1 分钟是 60 秒),再除以 60(因为 1 小时是 60 分钟),最后除以 24(因为 1 天是 24 小时),就得到了两个日期之间相差的天数。

Java 示例代码如下:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date departureDate = dateFormat.parse("A-B-C");
        Date returnDate = dateFormat.parse("X-Y-Z");

        long durationInMilliseconds = returnDate.getTime() - departureDate.getTime();
        int durationInDays = (int) (durationInMilliseconds / 1000 / 60 / 60 / 24);

        System.out.println("Duration in days: " + durationInDays);
    }
}

这样做的优点是,你只需要使用一个函数就能计算出两个日期之间相差的天数,代码更简洁。

但是,这种做法有一个缺点,就是它不能正确处理时区问题。如果离开日期和返回日期在不同的时区,计算出来的天数可能不准确。为了解决这个问题,你可以使用 java.time 包中的类,具体来说,你可以使用 LocalDate 类表示离开和返回的日期,然后使用 Period 类计算两个日期之间的天数。

Java 示例代码如下:

import java.time.LocalDate;
import java.time.Period;

public class Main {
    public static void main(String[] args) {
        LocalDate departureDate = LocalDate.of(A, B, C);
        LocalDate returnDate = LocalDate.of(X, Y, Z);

        Period period = Period.between(departureDate, returnDate);
        int durationInDays = period.getDays();

        System.out.println("Duration in days: " + durationInDays);
    }
}

这样做的优点是,它能够正确处理时区问题,所以你可以在不同的时区之间计算日期之差。

看到一个牛逼的算法给你分享一下,计算给定日期到 0年3月1日的天数,然后相减,获取天数的间隔

int day_diff(int year_start, int month_start, int day_start
            , int year_end, int month_end, int day_end)
{
    int y2, m2, d2;
    int y1, m1, d1;
    
    m1 = (month_start + 9) % 12;
    y1 = year_start - m1/10;
    d1 = 365*y1 + y1/4 - y1/100 + y1/400 + (m1*306 + 5)/10 + (day_start - 1);
 
    m2 = (month_end + 9) % 12;
    y2 = year_end - m2/10;
    d2 = 365*y2 + y2/4 - y2/100 + y2/400 + (m2*306 + 5)/10 + (day_end - 1);
    
    return (d2 - d1);
}


日期转换为 DateTime 类型,然后使用 TimeSpan.TotalDays 属性来获取它们之间的天数。

例如:DateTime startDate = new DateTime(A, B, C);
DateTime endDate = new DateTime(X, Y, Z);
TimeSpan duration = endDate - startDate;
double days = duration.TotalDays;

这样就可以得到两个日期之间的天数了。如果你想包含离开和返回当天,那么可以将天数加 1,例如:
double days = duration.TotalDays + 1;

希望能采纳宝贝