let string_of_date =
  let raw_string_of_date ~f_mon ~f_wday ~wday ~hours ~secs d =
    let tm = Unix.localtime d in
    let mon = f_mon tm.Unix.tm_mon in
    let day = f_wday tm.Unix.tm_wday in
    Printf.sprintf
      "%s%02d-%s-%4d%s"
      (if wday then day^", " else "")
      tm.Unix.tm_mday mon (tm.Unix.tm_year + 1900)
      (
       if hours then
         Printf.sprintf  " %02d:%02d%s"
           tm.Unix.tm_hour tm.Unix.tm_min
           (if secs then Printf.sprintf ":%02d" tm.Unix.tm_sec else "")
       else
         ""
      )
  in
  let mon_of_int_fr = function
    0 -> "Jan"
  | 1 -> "Fev"
  | 2 -> "Mar"
  | 3 -> "Avr"
  | 4 -> "Mai"
  | 5 -> "Jui"
  | 6 -> "Jul"
  | 7 -> "Aou"
  | 8 -> "Sep"
  | 9 -> "Oct"
  | 10 -> "Nov"
  | _ -> "Dec"
  in
  let wday_of_int_fr = function
    0 -> "Dimanche"
  | 1 -> "Lundi"
  | 2 -> "Mardi"
  | 3 -> "Mercredi"
  | 4 -> "Jeudi"
  | 5 -> "Vendredi"
  | _ -> "Samedi"
  in
  let mon_of_int_en = function
    0 -> "Jan"
  | 1 -> "Feb"
  | 2 -> "Mar"
  | 3 -> "Apr"
  | 4 -> "May"
  | 5 -> "Jun"
  | 6 -> "Jul"
  | 7 -> "Aug"
  | 8 -> "Sep"
  | 9 -> "Oct"
  | 10 -> "Nov"
  | _ -> "Dec"
  in
  let wday_of_int_en = function
    0 -> "Sunday"
  | 1 -> "Monday"
  | 2 -> "Tuesday"
  | 3 -> "Wednesday"
  | 4 -> "Thursday"
  | 5 -> "Friday"
  | _ -> "Saturday"
  in
  fun ?(fr=false)
    ?(wday=false) ?(hours=true) ?(secs=false) d ->
    let (f_mon, f_wday) =
      if fr then
        (mon_of_int_fr, wday_of_int_fr)
      else
        (mon_of_int_en, wday_of_int_en)
    in
    raw_string_of_date ~f_mon ~f_wday
      ~wday ~hours ~secs d