74 & yy_i, yd_i, mm_i, dd_i, h_i, m_i, s_i, &
75 & yd_dp, dd_dp, h_dp, m_dp, s_dp)
118 real(
dp),
intent(in) :: currenttime
120 integer,
intent(out),
optional :: yy_i
121 integer,
intent(out),
optional :: yd_i
122 integer,
intent(out),
optional :: mm_i
123 integer,
intent(out),
optional :: dd_i
124 integer,
intent(out),
optional :: h_i
125 integer,
intent(out),
optional :: m_i
126 integer,
intent(out),
optional :: s_i
128 real(
dp),
intent(out),
optional :: yd_dp
129 real(
dp),
intent(out),
optional :: dd_dp
130 real(
dp),
intent(out),
optional :: h_dp
131 real(
dp),
intent(out),
optional :: m_dp
132 real(
dp),
intent(out),
optional :: s_dp
136 logical :: isdayunits
138 integer :: myday, myhour, myminutes, myseconds
139 integer :: mymonth, myyday, myyear
141 real(
dp) :: datenumber, dayfraction, refdatenumber
142 real(
dp) :: hour, minutes, seconds
148 refdatenumber=
rclock%DateNumber(1)
154 calendar :
IF (int(
time_ref).gt.0)
THEN
155 datenumber=refdatenumber+currenttime
156 dayfraction=abs(datenumber-aint(datenumber))
159 CALL datevec (datenumber, isdayunits, myyear, mymonth, myday, &
160 & myhour, myminutes, seconds, minutes, hour)
161 myyday=
yearday(myyear, mymonth, myday)
162 myseconds=int(seconds)
171 datenumber=refdatenumber+currenttime
172 dayfraction=abs(datenumber-aint(datenumber))
175 CALL datevec (datenumber, isdayunits, myyear, mymonth, myday, &
176 & myhour, myminutes, seconds, minutes, hour)
177 myyday=
yearday(myyear, mymonth, myday)
178 myseconds=int(seconds)
187 datenumber=refdatenumber+currenttime
188 dayfraction=abs(datenumber-aint(datenumber))
191 CALL datevec (datenumber, isdayunits, myyear, mymonth, myday, &
192 & myhour, myminutes, seconds, minutes, hour)
193 myyday=int(datenumber-real(myyear*360,
dp)+1)
194 myseconds=int(seconds)
205 IF (currenttime.ge.refdatenumber)
THEN
206 datenumber=currenttime
208 datenumber=refdatenumber+currenttime
210 dayfraction=abs(datenumber-aint(datenumber))
213 CALL datevec (datenumber, isdayunits, myyear, mymonth, myday, &
214 & myhour, myminutes, seconds, minutes, hour)
215 myyday=
yearday(myyear, mymonth, myday)
216 myseconds=int(seconds)
223 IF (
PRESENT(yd_i)) yd_i=myyday
224 IF (
PRESENT(yy_i)) yy_i=myyear
225 IF (
PRESENT(mm_i)) mm_i=mymonth
226 IF (
PRESENT(dd_i)) dd_i=myday
227 IF (
PRESENT(h_i )) h_i =myhour
228 IF (
PRESENT(m_i )) m_i =myminutes
229 IF (
PRESENT(s_i )) s_i =myseconds
231 IF (
PRESENT(yd_dp)) yd_dp=real(myyday,
dp)+dayfraction
232 IF (
PRESENT(dd_dp)) dd_dp=real(myday,
dp)+dayfraction
233 IF (
PRESENT(h_dp )) h_dp =hour
234 IF (
PRESENT(m_dp )) m_dp =minutes
235 IF (
PRESENT(s_dp )) s_dp =seconds
242 & year, month, day, hour, minutes, seconds)
310 integer,
intent(in) :: year, month, day
312 integer,
intent(in),
optional :: hour
313 integer,
intent(in),
optional :: minutes
315 real(
dp),
intent(in),
optional :: seconds
317 real(
dp),
intent(out),
dimension(2) :: datenumber
321 integer,
parameter :: offset = 61
323 integer :: myday, myhour, myminutes, mymonth, myyear, y01
325 real(
dp) :: myseconds
331 IF (
PRESENT(hour))
THEN
337 IF (
PRESENT(minutes))
THEN
343 IF (
PRESENT(seconds))
THEN
364 calendar :
IF (int(
time_ref).eq.-2)
THEN
373 myyear=myyear-y01*100
374 myday=(146097*y01/4) + (1461*myyear/4) + ((153*mymonth+2)/5) + &
386 myday=year*360+(month-1)*30+(day-1)
398 mymonth=mod(month+9, 12)
399 myyear=year-int(0.1_dp*real(mymonth,
dp))
401 myday=int(365.0_dp*real(myyear,
dp))+ &
402 & int(0.25_dp*real(myyear,
dp))- &
403 & int(0.01_dp*real(myyear,
dp))+ &
404 & int(0.0025_dp*real(myyear,
dp))+ &
405 & int(0.1_dp*(real(mymonth,
dp)*306.0_dp + 5.0_dp))+ &
413 IF ((year.eq.0).and.(month.eq.0).and.(day.eq.0))
THEN
430 datenumber(1)=real(myday,
dp)+ &
431 & real(myhour,
dp)/24.0_dp+ &
432 & real(myminutes,
dp)/1440.0_dp+ &
433 & myseconds/86400.0_dp
437 datenumber(2)=real(myday,
dp)*86400.0_dp+ &
438 & real(myhour,
dp)*3600.0_dp+ &
439 & real(myminutes,
dp)*60.0_dp+ &
446 SUBROUTINE datestr (DateNumber, IsDayUnits, DateString)
468 logical,
intent(in) :: isdayunits
470 real(
dp),
intent(in) :: datenumber
472 character (len=*),
intent(out) :: datestring
476 integer :: i, year, month, day, hour, minutes
478 real(
dp):: f_hour, f_minutes, seconds
480 character (len= 5) :: sec_string
481 character (len=22) :: string
487 CALL datevec (datenumber, isdayunits, year, month, day, hour, &
488 & minutes, seconds, f_minutes, f_hour)
496 WRITE (sec_string,
'(f5.2)') seconds
497 DO i=1,len(sec_string)
498 IF (sec_string(i:i).eq.char(32))
THEN
505 WRITE (string,10) year, month, day, hour, minutes, sec_string
506 10
FORMAT (i4.4,
'-',i2.2,
'-',i2.2,1x,i2.2,
':',i2.2,
':',a)
508 datestring=trim(string)
515 & year, month, day, hour, minutes, seconds, &
550 logical,
intent(in) :: isdayunits
552 real(
dp),
intent(in) :: datenumber
554 integer,
intent(out) :: year, month, day, hour, minutes
556 real(
dp),
intent(out) :: f_hour, f_minutes, seconds
560 logical :: prolepticjulian = .false.
562 integer :: myday, mymonth, myyear, yday
563 integer :: ja, jalpha, jb, jc, jd, jday, je
565 integer,
parameter :: gregorian = 2299161
567 real(
dp),
parameter :: offset = 61.0_dp
569 real(
dp) :: ct, dayfraction, mydatenumber
570 real(
dp) :: dd, jr, js, mo, yy
588 calendar :
IF (int(
time_ref).eq.-2)
THEN
590 IF (datenumber.ge.real(gregorian,
dp))
THEN
591 mydatenumber=datenumber
593 mydatenumber=datenumber+
rclock%DateNumber(1)
596 IF (datenumber.ge.(real(gregorian,
dp)*86400.0_dp))
THEN
597 mydatenumber=datenumber/86400.0_dp
599 mydatenumber=(datenumber+
rclock%DateNumber(2))/86400.0_dp
602 dayfraction=abs(mydatenumber-aint(mydatenumber))
604 IF (prolepticjulian)
THEN
605 jday=int(mydatenumber)
606 IF (jday.ge.gregorian)
THEN
607 jalpha=int(((jday-1867216)-0.25_dp)/36524.25_dp)
608 ja=jday+1+jalpha-int(0.25_dp*real(jalpha,
dp))
613 jc=int(6680.0_dp+(real(jb-2439870,
dp)-122.1_dp)/365.25_dp)
614 jd=365*jc+int(0.25_dp*real(jc,
dp))
615 je=int(real(jb-jd,
dp)/30.6001_dp)
616 day=jb-jd-int(30.6001_dp*real(je,
dp))
618 IF (month.gt.12) month=month-12
620 IF (month.gt.2) year=year-1
621 IF (year .le.0) year=year-1
623 jr=floor(mydatenumber)-1721119.0_dp
625 yy=floor(js/146097.0_dp)
629 jr=floor(js/1461.0_dp)
630 dd=floor(((js-1461.0_dp*jr)+4.0_dp)*0.25_dp)
632 mo=floor(js/153.0_dp)
635 IF (mo.lt.10.0_dp)
THEN
642 day=int(((js-153.0_dp*mo)+5.0_dp)*0.2_dp)
645 seconds=dayfraction*86400.0_dp
646 ct=3.0_dp*epsilon(seconds)
647 seconds=
round(seconds, ct)
648 f_hour=seconds/3600.0_dp
650 seconds=abs(seconds-real(hour*3600,
dp))
651 f_minutes=seconds/60.0_dp
652 minutes=int(f_minutes)
653 seconds=abs(seconds-real(minutes*60,
dp))
661 dayfraction=abs(datenumber-aint(datenumber))
664 year=int(datenumber/360.0_dp)
665 yday=int(datenumber-real(year*360,
dp)+1)
667 year=int(datenumber/31104000.0_dp)
668 yday=int((datenumber-real(year*31104000,
dp)+1)/86400.0_dp)
670 month=((yday-1)/30)+1
673 seconds=dayfraction*86400.0_dp
674 ct=3.0_dp*epsilon(seconds)
675 seconds=
round(seconds, ct)
676 f_hour=seconds/3600.0_dp
678 seconds=abs(seconds-real(hour*3600,
dp))
679 f_minutes=seconds/60.0_dp
680 minutes=int(f_minutes)
681 seconds=abs(seconds-real(f_minutes*60,
dp))
690 mydatenumber=datenumber
692 mydatenumber=datenumber/86400.0_dp
694 dayfraction=abs(mydatenumber-aint(mydatenumber))
696 IF (mydatenumber.lt.offset)
THEN
697 mydatenumber=mydatenumber-offset+1.0_dp
699 mydatenumber=mydatenumber-offset
702 myyear=int((10000.0_dp*aint(mydatenumber)+14780.0_dp)/ &
704 myday=int(mydatenumber)- &
705 & (int(365.0_dp*real(myyear,
dp))+ &
706 & int(0.25_dp*real(myyear,
dp))- &
707 & int(0.01_dp*real(myyear,
dp))+ &
708 & int(0.0025_dp*real(myyear,
dp)))
711 myday=int(mydatenumber)- &
712 & (int(365.0_dp*real(myyear,
dp))+ &
713 & int(0.25_dp*real(myyear,
dp))- &
714 & int(0.01_dp*real(myyear,
dp))+ &
715 & int(0.0025_dp*real(myyear,
dp)))
717 mymonth=int((100.0_dp*real(myday,
dp)+ 52.0_dp)/3060.0_dp)
718 month=mod(mymonth+2, 12) + 1
720 & int((real(mymonth,
dp)+2.0_dp)/12.0_dp)
722 & int(0.1_dp*(real(mymonth,
dp)*306.0_dp + 5.0_dp)) + 1
727 IF (datenumber.eq.0.0_dp)
THEN
735 seconds=dayfraction*86400.0_dp
736 ct=3.0_dp*epsilon(seconds)
737 seconds=
round(seconds, ct)
739 f_hour=seconds/3600.0_dp
741 seconds=abs(seconds-real(hour*3600,
dp))
742 f_minutes=seconds/60.0_dp
743 minutes=int(f_minutes)
744 seconds=abs(seconds-real(minutes*60,
dp))
784 integer,
intent(in) :: month, day, year
786 integer,
intent(out) :: code
792 integer,
parameter :: base_cen = 1700
793 integer,
parameter :: base_qcen = 1600
794 integer,
parameter :: base_qyear = 1748
795 integer,
parameter :: base_year = 1752
796 integer,
parameter :: bym1_dec31 = 5
797 integer,
parameter :: feb_end = 59
799 integer :: i, leap, no_day, no_yr, nqy, nyc, nyqc
801 integer,
dimension(12) :: month_day = &
802 & (/ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 /)
820 leap=nqy/4-nyc/100+nyqc/400
821 leap_flag=((mod(nqy,4).eq.0).and.(mod(nyc,100).ne.0)).or. &
822 & (mod(nyqc,400).eq.0)
833 no_day=no_day+month_day(i)
835 IF (leap_flag.and.(no_day.le.feb_end)) no_day=no_day-1
836 IF (leap_flag.and.(month.eq.2).and.(day.eq.29)) no_day=no_day-1
844 no_day=mod(no_day,7)+mod(leap,7)+mod(no_yr,7)+bym1_dec31
874 character (len=*),
intent(out) :: date_str
878 integer :: iyear, imonth, iday, ihour, iminute, isecond
879 integer :: dindex, i, half, len1, len2, len3
881 integer,
dimension(8) :: values
883 integer,
dimension(31) :: lday = &
884 & (/ (1,i=1,9), (2,i=1,22) /)
886 integer,
dimension(12) :: lmonth = &
887 & (/ 7, 8, 5, 5, 3, 4, 4, 6, 9, 7, 8, 8 /)
889 character (len= 5) :: czone
890 character (len= 8) :: cdate
891 character (len=10) :: ctime
892 character (len=11) :: tstring
893 character (len=18) :: today
894 character (len=20) :: fmt
895 character (len=44) :: dstring
897 character (len=3),
dimension(0:1) :: ampm = &
900 character (len=9),
dimension(0:6) :: day = &
901 & (/
'Sunday ',
'Monday ',
'Tuesday ', &
902 &
'Wednesday',
'Thursday ',
'Friday ', &
905 character (len=9),
dimension(12) :: month = &
906 & (/
'January ',
'February ',
'March ', &
907 &
'April ',
'May ',
'June ', &
908 &
'July ',
'August ',
'September', &
909 &
'October ',
'November ',
'December ' /)
916 CALL date_and_time (cdate, ctime, czone, values)
931 IF (ihour.eq.0) ihour=12
932 IF (half.eq.2) half=0
938 CALL day_code (imonth, iday, iyear, dindex)
944 WRITE (fmt,10) lmonth(imonth), lday(iday)
945 10
FORMAT (
'(a',i1,
',1x,i',i1,
',1h,,1x,i4)')
946 WRITE (today,fmt) month(imonth), iday, iyear
948 WRITE (tstring,20) ihour, iminute, isecond, ampm(half)
949 20
FORMAT (i2,
':',i2.2,
':',i2.2,a3)
953 len1=len_trim(dstring)
955 len3=len_trim(tstring)
956 date_str=trim(adjustl(dstring(1:len1)))
958 len1=len_trim(date_str)
959 WRITE (date_str,
'(a," - ",a)') trim(date_str(1:len1)), &
960 & trim(today(1:len2))
963 len1=len_trim(date_str)
964 WRITE (date_str,
'(a," - ",a)') trim(date_str(1:len1)), &
965 & trim(tstring(1:len3))
1007 real(
dp),
intent(in) :: r_time
1012 integer :: iday, ihour, isec, iyear, leap, minute, month, yday
1014 real(
dp) :: day, sec
1016 real(
dp),
dimension(2) :: datenumber
1018 character (len=19) :: string
1019 character (len=20) :: calendar
1028 IF (int(r_time).gt.0)
THEN
1029 calendar=
'proleptic_gregorian'
1030 iyear=max(1,int(r_time*0.0001_dp))
1031 month=min(12,max(1,int((r_time-real(iyear*10000,
dp))*0.01_dp)))
1032 day=r_time-aint(r_time*0.01_dp)*100.0_dp
1033 iday=max(1,int(day))
1034 sec=(day-aint(day))*86400.0_dp
1035 ihour=int(sec/3600.0_dp)
1036 minute=int(mod(sec,3600.0_dp)/60.0_dp)
1037 isec=int(mod(sec,60.0_dp))
1038 yday=
yearday(iyear, month, iday)
1039 CALL datenum (datenumber, iyear, month, iday, ihour, minute, &
1046 ELSE IF (int(r_time).eq.0)
THEN
1047 calendar=
'proleptic_gregorian'
1055 yday=
yearday(iyear, month, iday)
1056 CALL datenum (datenumber, iyear, month, iday, ihour, minute, &
1090 ELSE IF (int(r_time).eq.-1)
THEN
1099 datenumber(1)=359.0_dp
1100 datenumber(2)=datenumber(1)*86400.0_dp
1110 ELSE IF (int(r_time).eq.-2)
THEN
1111 calendar=
'proleptic_julian'
1118 yday=
yearday(iyear, month, iday)
1119 datenumber(1)=2440000.0_dp
1120 datenumber(2)=datenumber(1)*86400.0_dp
1127 WRITE (string,10) iyear, month, iday, ihour, minute, isec
1128 10
FORMAT (i4.4,
'-',i2.2,
'-',i2.2,1x,i2.2,
':',i2.2,
':',i2.2)
1142 rclock%DateNumber(1)=datenumber(1)
1143 rclock%DateNumber(2)=datenumber(2)
1145 rclock%calendar =trim(calendar)
1346 & hour, minutes, seconds)
1386 integer,
intent(out) :: year, month, day, hour, minutes
1388 real(
dp),
intent(out) :: seconds
1390 character (len=*),
intent(in) :: ustring
1395 integer :: i, iblank, ie, is, iscale, lstr, lvar, nval
1398 real(
dp) :: rval(10)
1400 character (len=20) :: vstring
1401 character (LEN(Ustring)) :: tstring
1417 tstring(i:i)=char(32)
1422 tstring=adjustl(trim(ustring))
1423 lstr=len_trim(tstring)
1445 schar=ichar(tstring(i:i))
1446 IF (.not.(((48.le.schar).and.(schar.le.57)).or. &
1447 & (schar.eq.32).or.(schar.eq.46)))
THEN
1448 tstring(i:i)=char(32)
1451 tstring=adjustl(trim(tstring))
1452 lstr=len_trim(tstring)
1457 IF (index(ustring,
'since -').gt.0)
THEN
1474 IF (tstring(i:i).eq.char(32))
THEN
1475 IF (tstring(i+1:i+1).ne.char(32)) decode=.true.
1480 IF (decode.or.(i.eq.lstr))
THEN
1482 vstring=tstring(is:ie)
1483 lvar=len_trim(vstring)
1484 READ (vstring(1:lvar),*) rval(nval)
1496 year=int(rval(i))*iscale
1504 minutes=int(rval(i))