package timedesc

  1. Overview
  2. Docs

Source file RFC3339.ml

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
OCaml

Innovation. Community. Security.