PROGRAM unixsec
  IMPLICIT NONE

  
  INTEGER :: total, year, month, day, hour, minute, second
  INTEGER :: r
  LOGICAL :: leap
  INTEGER, PARAMETER :: sec_in_minute = 60
  INTEGER, PARAMETER :: sec_in_hour   = 60 * sec_in_minute
  INTEGER, PARAMETER :: sec_in_day    = 24 * sec_in_hour
  
  total = 1000000000
  PRINT *, total, "δευτερόλεπτα μετά την 1/1/1970, 00:00:00 είναι την"

  
  ! Αφαιρούμε τα δευτερολεπτα κάθε χρόνου από το 1970 και μετά
  ! έως ότου δεν απομένουν αρκετά δευτερόλεπτα.
  year = 1970
  DO
     leap = (MOD(year, 4) == 0 .AND. MOD(year, 100) /= 0) .OR. MOD(year,400)==0

     IF (leap) then 
        r = 366 * sec_in_day
     else
        r = 365 * sec_in_day
     endif
     
     IF (total < r) EXIT
     
     total = total - r
     year = year+1
  END DO

  ! Βρήκαμε το έτος: είναι το year

  
  ! Αφαιρούμε τα δευτερολεπτα κάθε μήνα στο έτος year
  ! έως ότου δεν απομένουν αρκετά δευτερόλεπτα.
    DO month = 1, 12

     SELECT CASE (month)
     CASE(1,3,5,7,8,10,12)
        day = 31
     CASE (4,6,9,11)
        day = 30
     CASE (2)
        day = 28
        leap = (MOD(year, 4) == 0 .AND. MOD(year, 100) /= 0) .OR. MOD(year,400)==0
        IF (leap) day = 29
     END SELECT

     r = day * sec_in_day 

     IF (total < r) EXIT

     total = total - r
  END DO

  ! Βρήκαμε το μήνα: είναι το month

  
  ! Βρίσκουμε πόσες ημέρες είναι στα total δευτερολεπτα και τι απομένει.
  day = 1
  DO
     r = sec_in_day
     IF (total < r) EXIT
     total = total - r
     day = day + 1
  END DO

  ! 'Η:
  ! day = total / sec_in_day + 1
  ! total = MOD(total, sec_in_day)

  ! Βρήκαμε την ημέρα: είναι το day.

  ! Βρίσκουμε πόσες ώρες είναι στα total δευτερολεπτα και τι απομένει.
  hour = total / sec_in_hour
  total = MOD(total, sec_in_hour)

  ! Βρήκαμε την ώρα: είναι το hour.

  ! Βρίσκουμε πόσα λεπτά είναι στα total δευτερολεπτα και τι απομένει.
  minute = total / sec_in_minute
  total = MOD(total, sec_in_minute)

  ! Βρήκαμε τα λεπτά. Τα δευτερόλεπτα είναι:
  second = total
  
  PRINT *, day, '/', month, '/', year, ' ', hour, ':', minute, ":", second
END PROGRAM unixsec
