计算两个日期间的天数问题。
学者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;
希望能采纳宝贝