1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
let pp_date formatter (date : Date.t) =
let Date.Ymd'.{ year; month; day } = Date.Ymd'.view date in
Format.fprintf formatter "%04d-%02d-%02d" year month day
let pp_time ?frac_s () formatter (time : Time.t) =
let { Time.hour; minute; second; ns } = Time.view time in
let ns = ns mod Span.ns_count_in_s in
let frac_s =
match frac_s with
| None -> Printers.deduce_smallest_lossless_frac_s ~ns
| Some x -> x
in
if frac_s < 0 then invalid_arg "pp_time: frac_s cannot be < 0"
else if frac_s > 9 then invalid_arg "pp_time: frac_s cannot be > 9"
else
let second = if Time.is_leap_second time then 60 else second in
Format.fprintf formatter "%02d:%02d:%02d%s" hour minute second
(Printers.string_of_s_frac ~sep:'.' ~frac_s ~ns)
let pp_date_time' ?frac_s pp_date () formatter (dt : Date_time.t) =
match Date_time.offset_from_utc dt with
| `Ambiguous _ -> raise (Printers.Date_time_cannot_deduce_offset_from_utc dt)
| `Single offset ->
let offset_view = Span.For_human'.view offset in
let tz_off =
if Span.(offset = zero) then "Z"
else
let sign = match offset_view.sign with `Pos -> '+' | `Neg -> '-' in
if offset_view.seconds > 0 then
Printf.sprintf "%c%02d:%02d:%02d" sign
offset_view.hours
offset_view.minutes
offset_view.seconds
else
Printf.sprintf "%c%02d:%02d" sign
offset_view.hours
offset_view.minutes
in
Format.fprintf formatter "%aT%a%s" pp_date (Date_time.date dt)
(pp_time ?frac_s ()) (Date_time.time dt) tz_off
let pp_date_time ?frac_s () formatter (dt : Date_time.t) =
pp_date_time' ?frac_s pp_date () formatter dt
let of_date_time ?frac_s (dt : Date_time.t) : string =
Format.asprintf "%a" (pp_date_time ?frac_s ()) dt
let of_time ?frac_s (time : Time.t) : string =
Format.asprintf "%a" (pp_time ?frac_s ()) time
let pp_timestamp ?frac_s () formatter (x : Span.t) =
match Date_time.of_timestamp ~tz_of_date_time:Time_zone.utc x with
| None -> invalid_arg "Invalid timestamp"
| Some dt -> Format.fprintf formatter "%a" (pp_date_time ?frac_s ()) dt
let of_timestamp ?frac_s (x : Span.t) : string =
Format.asprintf "%a" (pp_timestamp ?frac_s ()) x