JPL’s SPICE Toolkit (SPICELIB) is the premier software library for computations related to solar system geometry. It is freely distributed, and is also one of the best-documented libraries I have ever come across. SPICELIB also includes a comprehensive set of routines for date and time conversions. An example is shown here:
program spice_test use iso_fortran_env, only: wp => real64 implicit none interface ! SPICELIB routines subroutine timout ( et, pictur, output ) import :: wp implicit none real(wp),intent(in) :: et character(len=*),intent(in) :: pictur character(len=*),intent(out) :: output end subroutine timout subroutine str2et ( string, et ) import :: wp implicit none character(len=*),intent(in) :: string real(wp),intent(out) :: et end subroutine str2et subroutine furnsh ( file ) implicit none character(len=*),intent(in) :: file end subroutine furnsh end interface character(len=*),parameter :: time_in = & '2017 Aug 12 00:00:00 TDB' character(len=*),parameter :: pictur = & 'Mon DD,YYYY HR:MN:SC.#### UTC ::UTC' real(wp) :: et character(len=100) :: time_out ! load the leap second kernel: call furnsh('naif0012.tls') ! example conversion: call str2et(time_in, et) call timout(et, pictur, time_out) write(*,*) 'time_in: ', time_in write(*,*) 'et: ', et write(*,*) 'time_out: ', time_out end program spice_test
A few things to note:
- Here we are using the SPICE routines str2et and timout to convert a string from a TDB calendar date to ephemeris time and then to a UTC calendar date. These routines are very flexible and can convert a wide range of date formats. Other routines are available to do other transformations.
- The base time system of SPICE is Barycentric Dynamical Time (TDB). “Ephemeris time” is a count of TDB seconds since the J2000 epoch (Jan 1, 2000 12:00:00).
- We have to load the latest leap second kernel (naif0012.tls in this case), which is necessary to define UTC.
- The SPICE routines are not in a module (the code is Fortran 77), and so have no explicit interfaces. Thus it is good practice to specify them as I do here.
The output of this example is:
time_in: 2017 Aug 12 00:00:00 TDB
time_out: Aug 11,2017 23:58:50.8169 UTC