Module datedef
 Type datetime
    integer :: y,m,d,h
 End Type datetime

 Contains

 function set_date(y,m,d,h)
    integer :: y,m,d,h
    Type (datetime) :: set_date
    set_date%y=y
    set_date%m=m
    set_date%d=d
    set_date%h=h
 End function set_date


!--not completed
 function validate_date(date)
   integer :: validate_date
   Type (datetime) :: date
   
   validate_date=1

 end function validate_date

 function days_of_month(y,m)
    integer :: days_of_month,y,m
    Select case (m)
      case (1,3,5,7,8,10,12)
        days_of_month=31
      case (2)
        if ( ((mod(y,4)==0).and.(mod(y,100)/=0)).or.(mod(y,400)==0) ) then
           days_of_month = 29
        else
           days_of_month=28
        endif
      case default 
        days_of_month=30
    End Select
 end function days_of_month

! Note: hrs < 24
 subroutine add_hrs(date,hrs) 
    Type(datetime) :: date
    integer :: hrs,dom
    date%h = date%h + hrs
    if (date%h >= 24) then
       date%h = date%h - 24
       date%d = date%d + 1
       dom = days_of_month(date%y,date%m)
       if (date%d>dom) then
          date%d = 1
          date%m = date%m + 1
          if (date%m > 12) then
             date%m = 1
             date%y = date%y + 1
          endif
       endif
    endif
 end subroutine add_hrs

! Return -1, date1<date2,0 date1=date2, 1 date1>date2
 function date_comp(date1,date2)
    Type (datetime) :: date1, date2
    integer :: date_comp, temp1, temp2
    temp1=365*24*date1%y + 30*24*date1%m + 24*date1%d+date1%h
    temp2=365*24*date2%y + 30*24*date2%m + 24*date2%d+date2%h
    if (temp1<temp2) then
        date_comp=-1
    elseif (temp1==temp2) then
        date_comp=0
    else
        date_comp=1
    endif
 end function date_comp
End Module datedef

