YYYYMMDD to Year, Month, Day Conversion

Problem Statement

In data processing, the year, month and day information are usually written as yyyymmdd, where the first four digits are Year, the fifth and sixth digits are Month, and the last two digits are Day. For example, 19710428 means April 8, 1971, and 20000101 means January 1, 2000.

Write a program to read an integer in the form of yyyymmdd and extract the values of Year, Month and Day. Do it with an external subroutine.

Solution

! --------------------------------------------------------------------
! PROGRAM  YYYYMMDDConversion:
!    This program uses an external subroutine Conversion() to convert
! an integer value in the form of YYYYMMDD to Year, Month and Day.
! --------------------------------------------------------------------

PROGRAM  YYYYMMDDConversion
   IMPLICIT  NONE

   INTERFACE                            ! interface block
      SUBROUTINE  Conversion(Number, Year, Month, Day)
         INTEGER, INTENT(IN)  :: Number
         INTEGER, INTENT(OUT) :: Year, Month, Day
      END SUBROUTINE  Conversion
   END INTERFACE

   INTEGER :: YYYYMMDD, Y, M, D

   DO                                   ! loop until a zero is seen
      WRITE(*,*)  "A YYYYMMDD (e.g., 19971027) please (0 to stop) -> "
      READ(*,*)   YYYYMMDD              ! read in the value
      IF (YYYYMMDD == 0)  EXIT          ! if 0, then bail out

      CALL  Conversion(YYYYMMDD, Y, M, D)    ! do conversation

      WRITE(*,*)  "Year  = ", Y         ! display results
      WRITE(*,*)  "Month = ", M
      WRITE(*,*)  "Day   = ", D
      WRITE(*,*)
   END DO
END PROGRAM  YYYYMMDDConversion

! --------------------------------------------------------------------
! SUBROUTINE  Conversion():
!    This external subroutine takes an integer input Number in the
! form of YYYYMMDD and convert it to Year, Month and Day.
! --------------------------------------------------------------------

SUBROUTINE  Conversion(Number, Year, Month, Day)
   IMPLICIT  NONE

   INTEGER, INTENT(IN)  :: Number
   INTEGER, INTENT(OUT) :: Year, Month, Day

   Year  = Number / 10000
   Month = MOD(Number, 10000) / 100
   Day   = MOD(Number, 100)
END SUBROUTINE  Conversion
Click here to download this program.

Program Input and Output

The following is the output from the above program for the input 3.0, 6.0 and 8.0:
A YYYYMMDD (e.g., 19971027) please (0 to stop) ->
19971026
Year  = 1997
Month = 10
Day   = 26

A YYYYMMDD (e.g., 19971027) please (0 to stop) ->
20160131
Year  = 2016
Month = 1
Day   = 31

A YYYYMMDD (e.g., 19971027) please (0 to stop) ->
19010103
Year  = 1901
Month = 1
Day   = 3

A YYYYMMDD (e.g., 19971027) please (0 to stop) ->
0

Discussion