sig
  type t
  type field = [ `Hour | `Minute | `Second ]
  type second = int
  module Second :
    sig
      type t = second
      val from_int : int -> t
      val from_float : float -> t
      val to_int : t -> int
      val to_float : t -> float
    end
  val make : int -> int -> second -> t
  val lmake : ?hour:int -> ?minute:int -> ?second:second -> unit -> t
  val now : unit -> t
  val midnight : unit -> t
  val midday : unit -> t
  val convert : t -> Time_Zone.t -> Time_Zone.t -> t
  val from_gmt : t -> t
  val to_gmt : t -> t
  val normalize : t -> t * int
  val hour : t -> int
  val minute : t -> int
  val second : t -> second
  val to_seconds : t -> second
  val to_minutes : t -> float
  val to_hours : t -> float
  val equal : t -> t -> bool
  val compare : t -> t -> int
  val hash : t -> int
  val is_pm : t -> bool
  val is_am : t -> bool
  val from_seconds : second -> t
  val from_minutes : float -> t
  val from_hours : float -> t
  module Period :
    sig
      type t
      val empty : t
      val add : t -> t -> t
      val sub : t -> t -> t
      val opp : t -> t
      val equal : t -> t -> bool
      val compare : t -> t -> int
      val hash : t -> int
      val length : t -> second
      val mul : t -> t -> t
      val div : t -> t -> t
      val make : int -> int -> second -> t
      val lmake : ?hour:int -> ?minute:int -> ?second:second -> unit -> t
      val hour : int -> t
      val minute : int -> t
      val second : second -> t
      val to_seconds : t -> second
      val to_minutes : t -> float
      val to_hours : t -> float
    end
  val add : t -> Period.t -> t
  val sub : t -> t -> Period.t
  val rem : t -> Period.t -> t
  val next : t -> field -> t
  val prev : t -> field -> t
end