sig
  module Date : Date_sig.S
  module Time : Time_sig.S
  type t
  type day = Date.day = Sun | Mon | Tue | Wed | Thu | Fri | Sat
  type month =
    Date.month =
      Jan
    | Feb
    | Mar
    | Apr
    | May
    | Jun
    | Jul
    | Aug
    | Sep
    | Oct
    | Nov
    | Dec
  type year = Date.year
  type second = Time.second
  type field = [ `Day | `Hour | `Minute | `Month | `Second | `Week | `Year ]
  val make :
    int ->
    int -> int -> int -> int -> Calendar_sig.S.second -> Calendar_sig.S.t
  val lmake :
    year:int ->
    ?month:int ->
    ?day:int ->
    ?hour:int ->
    ?minute:int -> ?second:Calendar_sig.S.second -> unit -> Calendar_sig.S.t
  val create : Date.t -> Time.t -> Calendar_sig.S.t
  val now : unit -> Calendar_sig.S.t
  val from_jd : float -> Calendar_sig.S.t
  val from_mjd : float -> Calendar_sig.S.t
  val convert :
    Calendar_sig.S.t -> Time_Zone.t -> Time_Zone.t -> Calendar_sig.S.t
  val to_gmt : Calendar_sig.S.t -> Calendar_sig.S.t
  val from_gmt : Calendar_sig.S.t -> Calendar_sig.S.t
  val days_in_month : Calendar_sig.S.t -> int
  val day_of_week : Calendar_sig.S.t -> Calendar_sig.S.day
  val day_of_month : Calendar_sig.S.t -> int
  val day_of_year : Calendar_sig.S.t -> int
  val week : Calendar_sig.S.t -> int
  val month : Calendar_sig.S.t -> Calendar_sig.S.month
  val year : Calendar_sig.S.t -> int
  val to_jd : Calendar_sig.S.t -> float
  val to_mjd : Calendar_sig.S.t -> float
  val hour : Calendar_sig.S.t -> int
  val minute : Calendar_sig.S.t -> int
  val second : Calendar_sig.S.t -> Calendar_sig.S.second
  val equal : Calendar_sig.S.t -> Calendar_sig.S.t -> bool
  val compare : Calendar_sig.S.t -> Calendar_sig.S.t -> int
  val hash : Calendar_sig.S.t -> int
  val is_leap_day : Calendar_sig.S.t -> bool
  val is_gregorian : Calendar_sig.S.t -> bool
  val is_julian : Calendar_sig.S.t -> bool
  val is_pm : Calendar_sig.S.t -> bool
  val is_am : Calendar_sig.S.t -> bool
  val to_unixtm : Calendar_sig.S.t -> Unix.tm
  val from_unixtm : Unix.tm -> Calendar_sig.S.t
  val to_unixfloat : Calendar_sig.S.t -> float
  val from_unixfloat : float -> Calendar_sig.S.t
  val from_date : Date.t -> Calendar_sig.S.t
  val to_date : Calendar_sig.S.t -> Date.t
  val to_time : Calendar_sig.S.t -> Time.t
  module Period :
    sig
      type +'a period constraint 'a = [< Period.date_field ]
      type t = Period.date_field Calendar_sig.S.Period.period
      val empty : [< Period.date_field ] Calendar_sig.S.Period.period
      val add :
        ([< Period.date_field > `Day `Week ] as 'a)
        Calendar_sig.S.Period.period ->
        'Calendar_sig.S.Period.period -> 'Calendar_sig.S.Period.period
      val sub :
        ([< Period.date_field > `Day `Week ] as 'a)
        Calendar_sig.S.Period.period ->
        'Calendar_sig.S.Period.period -> 'Calendar_sig.S.Period.period
      val opp :
        ([< Period.date_field > `Day `Week ] as 'a)
        Calendar_sig.S.Period.period -> 'Calendar_sig.S.Period.period
      val equal :
        [< Period.date_field ] Calendar_sig.S.Period.period ->
        [< Period.date_field ] Calendar_sig.S.Period.period -> bool
      val compare :
        [< Period.date_field ] Calendar_sig.S.Period.period ->
        [< Period.date_field ] Calendar_sig.S.Period.period -> int
      val hash : [< Period.date_field ] Calendar_sig.S.Period.period -> int
      val make :
        int ->
        int ->
        int -> int -> int -> Calendar_sig.S.second -> Calendar_sig.S.Period.t
      val lmake :
        ?year:int ->
        ?month:int ->
        ?day:int ->
        ?hour:int ->
        ?minute:int ->
        ?second:Calendar_sig.S.second -> unit -> Calendar_sig.S.Period.t
      val year :
        int -> [< Period.date_field > `Year ] Calendar_sig.S.Period.period
      val month :
        int ->
        [< Period.date_field > `Month `Year ] Calendar_sig.S.Period.period
      val week :
        int ->
        [< Period.date_field > `Day `Week ] Calendar_sig.S.Period.period
      val day :
        int ->
        [< Period.date_field > `Day `Week ] Calendar_sig.S.Period.period
      val hour :
        int ->
        [< Period.date_field > `Day `Week ] Calendar_sig.S.Period.period
      val minute :
        int ->
        [< Period.date_field > `Day `Week ] Calendar_sig.S.Period.period
      val second :
        Calendar_sig.S.second ->
        [< Period.date_field > `Day `Week ] Calendar_sig.S.Period.period
      val from_date :
        ([< Period.date_field ] as 'a) Date.Period.period ->
        'Calendar_sig.S.Period.period
      val from_time :
        ([< Period.date_field ] as 'a) Time.Period.period ->
        'Calendar_sig.S.Period.period
      val to_date :
        ([< Date.field ] as 'a) Calendar_sig.S.Period.period ->
        'Date.Period.period
      exception Not_computable
      val to_time :
        ([< Period.date_field ] as 'a) Calendar_sig.S.Period.period ->
        'Time.Period.period
      val safe_to_time :
        ([< `Day | `Week ] as 'a) Calendar_sig.S.Period.period ->
        'Time.Period.period
      val ymds :
        [< Period.date_field ] Calendar_sig.S.Period.period ->
        int * int * int * Calendar_sig.S.second
    end
  val add :
    Calendar_sig.S.t ->
    [< Period.date_field ] Calendar_sig.S.Period.period -> Calendar_sig.S.t
  val sub :
    Calendar_sig.S.t ->
    Calendar_sig.S.t ->
    [< Period.date_field > `Day `Week ] Calendar_sig.S.Period.period
  val precise_sub :
    Calendar_sig.S.t -> Calendar_sig.S.t -> Calendar_sig.S.Period.t
  val rem :
    Calendar_sig.S.t ->
    [< Period.date_field ] Calendar_sig.S.Period.period -> Calendar_sig.S.t
  val next : Calendar_sig.S.t -> Calendar_sig.S.field -> Calendar_sig.S.t
  val prev : Calendar_sig.S.t -> Calendar_sig.S.field -> Calendar_sig.S.t
end