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