计算一个月的日期

时间:2016-10-14 19:36:47

标签: ocaml

我是FP和OCaml的新手。我的问题是我如何在OCaml中编写一个函数,这将给我输入整数的那一天。我想这是一种方法,但不方便,每个月都需要修改。我们假设以下代码适用于2016年10月

let int_of_day = function
 | 1 -> "Sat"
 | 2 -> "Sun"
 ...
 | 31 -> "Mon";;

哪个运行但会发出警告,因为此模式匹配并非详尽无误,并且未使用0。 您有什么建议让这项工作更好? 谢谢你。

3 个答案:

答案 0 :(得分:1)

您可以使用Calendar提供的opam库。安装完成后,您可以使用以下内容:

let date = CalendarLib.Date.lmake ~year:2016 ~month:10 ~day:18 ();;
let day = CalendarLib.Date.day_of_week d;;

day将是枚举类型CalendarLib.Date.day(事实上Wed)。

答案 1 :(得分:0)

正如Gabriel在对您的代码的评论中指出的那样,您应该使用某个公式来计算一周中的某一天。这是另一个list of formulas

关于警告的内容,然后为了使模式匹配穷举,如OCaml所要求的,您需要添加一个全匹配的通配符模式_,例如,

...
| 31 -> "Mon"
| _ -> invalid_arg "must be a number between 1 and 31"

答案 2 :(得分:0)

您可以使用Unix.mktime进行所有计算。

  let give_day y m d =
    let (_,tm)=Unix.mktime
      {
         Unix.tm_sec=0;
         Unix.tm_min=0;
         Unix.tm_hour=0;

         Unix.tm_mday=d;
         Unix.tm_mon=m-1;
         Unix.tm_year=y-1900;

         Unix.tm_wday=0;
         Unix.tm_yday=0;
         Unix.tm_isdst=false;
      }
    in
    tm.tm_wday
  in

  let day=give_day  2016 10 1 in
    Printf.printf "1/10/2016 %d\n" day ;
  let day=give_day  2016 10 10 in
    Printf.printf "10/10/2016 %d\n" day ;

测试:

1/10/2016 6
10/10/2016 1

6是星期六,1是星期一。