| David Frank 2005-08-29, 7:01 pm |
| Whoops, w days do throw a wrench into my previous solution...
A minor modification for a known monday is required to allow w days to be
calculated,
Such a date is 1900/01/01 which was a monday, so I have adjusted the date
routines to start them from 1900..
Let me know if this has problems with your w day calculations
! -----------------
program find_dates_w days ! from 1900
integer :: dw, ndw, month, year, date(3), jday, dw1
dw = 1 ! find a mon
ndw = 5 ! find the 5th monday
month = 08 ! in august
year = 2005
jday = Date2jday([year,month,01] ) ! Jday of 1st day in month
do jday = jday,jday+6
dw1 = mod(jday-1,7)+1
if (dw1 /= dw) cycle
write (*,91) 'date found = ',jday2date(jday+(ndw-1)*7)
exit
end do
91 format (a,i4,2('/',i2.2))
stop
contains
! -------------------------
function Date2jday(date) result (jday)
integer :: date(3), yyyy,mm,dd, jday, jd0 = 2415020 ! starting 1900/01/01
yyyy = date(1) ; mm = date(2) ; dd = date(3)
jday = dd-32075+1461*(yyyy+4800+(mm-14)/12)/4 &
+ 367*(mm-2-(mm-14)/12*12)/12 - 3*((yyyy+4900+(mm-14)/12)/100)/4 -jd0
end function Date2jday
! -------------------------
function Jday2date (jday) result (date)
implicit none
integer :: jday, date(3)
integer :: yyyy, mm, dd, dw, m, n, i, j, jd0 = 2415020 ! starting
1900/01/01
m = jday+68569 +jd0 ; n = 4*m/146097
m = m-(146097*n+3)/4 ; i = 4000*(m+1)/1461001
m = m-1461*i/4+31 ; j = 80*m/2447
dd = m-2447*j/80 ; m = j/11
mm = j+2-12*m
yyyy = 100*n+i+m-4900
date(1) = yyyy ; date(2) = mm ; date(3) = dd
end function Jday2date
end program
|