Dealing with "Precise" Dates

I already posted an article on (begining) playing with Dates on OCaml.

Preparing the Toplevel

As usual, we have to load and use several modules:

#use "topfind";;
#require "calendar";;

Creating a Second

To create a second, the top reachable precision:

CalendarLib.Time.Second.from_int 5;;

Creating a Precise Date

To create a precise date, let's use the "make" function:

CalendarLib.Fcalendar.Precise.make 2011 08 12 05 32 (float_of_int (CalendarLib.Time.Second.from_int 5));;
CalendarLib.Fcalendar.Precise.make 2011 08 12 05 32 5.;;

Create a Precise Period

When wanting to add 2 days to a date, we must use "The Date + 2 days Period". To create that "Period":

CalendarLib.Fcalendar.Precise.Period.make 2011 08 12 05 32 (float_of_int (CalendarLib.Time.Second.from_int 5));;
CalendarLib.Fcalendar.Precise.Period.make 2011 08 12 05 32 5.;;

Make an operation (add)

Let's create a Date, and calculate the "two days later" Date:

let d2 = CalendarLib.Fcalendar.Precise.add
(CalendarLib.Fcalendar.Precise.make 2011 08 12 05 32 (float_of_int (CalendarLib.Time.Second.from_int 5)))
(CalendarLib.Fcalendar.Precise.Period.make 0 0 2 0 0 (float_of_int (CalendarLib.Time.Second.from_int 0)))
;;
let d2 = CalendarLib.Fcalendar.Precise.add
(CalendarLib.Fcalendar.Precise.make 2011 08 12 05 32 5.)
(CalendarLib.Fcalendar.Precise.Period.make 0 0 2 0 0 0.)
;;
Then display it:
CalendarLib.Printer.Precise_Fcalendar.to_string d2;;

If the Date was from a string

I mostly intend to take the Date from an external source: A "date" field from a SQLite3 database, which is formatted "2011-08-16 16:00:01". To use it:

let initiale = CalendarLib.Printer.Precise_Fcalendar.from_fstring "%F %T" "2011-08-16 16:00:01";;
Then to add 2 days to it:
let initiale_2 =
CalendarLib.Fcalendar.Precise.add
initiale
(CalendarLib.Fcalendar.Precise.Period.make 0 0 2 0 0 (float_of_int (CalendarLib.Time.Second.from_int 0)))
;;
Finally print it:
CalendarLib.Printer.Precise_Fcalendar.to_string initiale_2;;