program days_between_dates
implicit none
integer :: days
integer, parameter :: year1 = 2023, month1 = 1, day1 = 1
integer, parameter :: year2 = 2023, month2 = 12, day2 = 31
days = days_between(year1, month1, day1, year2, month2, day2)
write(*,*) '两个日期相隔的天数为:', days
contains
function days_between(y1, m1, d1, y2, m2, d2) result(days)
integer, intent(in) :: y1, m1, d1, y2, m2, d2
integer :: days
integer :: days1, days2
days1 = days_in_year(y1)
days2 = days_in_year(y2)
days1 = days1 + days_from_start(y1, m1, d1)
days2 = days2 + days_from_start(y2, m2, d2)
days = abs(days1 - days2)
end function days_between
function days_from_start(year, month, day) result(days)
integer, intent(in) :: year, month, day
integer :: days
integer :: i
integer, dimension(12) :: days_per_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if (is_leap_year(year)) days_per_month(2) = 29
days = 0
do i = 1, month - 1
days = days + days_per_month(i)
end do
days = days + day
end function days_from_start
function is_leap_year(year) result(is_leap)
integer, intent(in) :: year
logical :: is_leap
if ((mod(year, 4) == 0 .and. mod(year, 100) /= 0) .or. mod(year, 400) == 0) then
is_leap =.true.
else
is_leap =.false.
end if
end function is_leap_year
function days_in_year(year) result(days)
integer, intent(in) :: year
integer :: days
if (is_leap_year(year)) then
days = -1
else
days = -2
end if
end function days_in_year
end program days_between_dates