SATySFi でツェラーの公式を使って日付から曜日を計算するコードです。
コード例
@require: stdja
@require: standalone
% 日付と曜日を表す型の定義
type date = (|
year : int;
month : int;
date : int;
|)
type day = Mon | Tue | Wed | Thu | Fri | Sat | Sun
let day-of-int n =
let h = n mod 7 in
match h with
| 1 -> Sun
| 2 -> Mon
| 3 -> Tue
| 4 -> Wed
| 5 -> Thu
| 6 -> Fri
| _ -> Sat
let string-of-day-ja d =
match d with
| Mon -> `月`
| Tue -> `火`
| Wed -> `水`
| Thu -> `木`
| Fri -> `金`
| Sat -> `土`
| Sun -> `日`
% ツェラーの公式による曜日計算
% ただし、グレゴリオ暦を仮定します
% y >= 1582 程度を仮定します
let get-day date =
let y =
let base =
if date#month <= 2 then date#year - 1
else date#year
in
if base >= 0 then base
else 1 - base
in
let m =
if date#month <= 2 then 12 + date#month
else date#month
in
let d = date#date in
let j = y / 100 in
let yy = y mod 100 in
let gamma = 5 * j + j / 4 in
let i1 = (13 * (m + 1)) / 5 in
let i2 = yy / 4 in
let sum = d + i1 + yy + i2 + gamma in
day-of-int sum
let-inline \day-ja date =
get-day date
|> string-of-day-ja
|> embed-string
in
standalone '<
+p {
2018年7月10日は\day-ja(| year = 2018; month = 7; date = 10 |);曜日です。
}
>
コード例の組版結果 (SATySFi version 0.0.3)