Chrono Mock
言語日本語

どの日付をテストすべきか

日付テストの半分は時計を動かすことです。もう半分は、どこへ動かすかを知ることです。オンラインの電卓なら、今日から 90 日後がいつかは教えてくれます。しかし、その日が銀行の休業日だとか、四半期の最終日だとかは教えてくれません。

Chrono Mock の電卓。左には検索できるシナリオの一覧とその説明、中央には日付ビルダー、右の結果列にはすべての形式がコピーボタン付きで並び、その下に Use this date があります。ビルダーの下では、貼り付けられた 04/08/2008 が曖昧と判定され、アメリカ式とポーランド式の両方の読みが表示されています。
ビルダーの下には逆方向の機能があります。04/08/2008 を貼り付けると、1 つに決め打ちせず、両方の読みを表示します。

実際の祝日を考慮した営業日

「10 営業日後」は単純な算術ではありません。どの国のカレンダーで数えるかによって変わります。同じ開始日、同じ 10 日間で、答えが 2 通りになります。

$ chrono calc --base 2027-09-01T00:00:00 --shift +10bd --calendar us-banking
  result:  2027-09-16T00:00:00

$ chrono calc --base 2027-09-01T00:00:00 --shift +10bd --calendar pl
  result:  2027-09-15T00:00:00

1 日違います。間の日付について尋ねれば、電卓がその理由を教えてくれます。

$ chrono calc --base 2027-09-06T00:00:00 --calendar us-banking
  metadata:
    weekday       Monday
    business day  no  (us-banking)
    holiday       Labor Day
  what this date lands on:
    public holiday
    (weekend and holiday marks follow the us-banking calendar)

アメリカとポーランドは参照用のカレンダーとして同梱されています。この 2 つで、固定日、月の第 n 週の曜日、復活祭から計算される日付、土曜日に当たる祝日が前の金曜日に振り替えられるアメリカの規則と、存在するあらゆる種類の規則を網羅できるからです。国を追加するのはデータファイルの追加であり、コードの変更ではありません。

すべての形式を一度に

テスト対象のアプリは、期待する形式で日付を求めます。変換の手間をかけさせる代わりに、電卓はすべての形式を出力します。標準的な形式に合わないものには、独自のマスクも使えます。

$ chrono calc --preset year-2038 --zone +00:00
Chrono Mock - date calculator
  preset:   year-2038 - 2038 boundary
  explains: Does the app survive the 32-bit Unix time boundary (2038-01-19T03:14:07Z)?
  result:  2038-01-19T03:14:07
  formats:
    ISO date      2038-01-19
    ISO datetime  2038-01-19T03:14:07+00:00
    US            01/19/2038
    PL            19.01.2038
    epoch (s)     2147483647
    epoch (ms)    2147483647000
    FILETIME      137919572470000000
    RFC 1123      Tue, 19 Jan 2038 03:14:07 GMT
  ...
  what this date lands on:
    at or past the 2038-01-19T03:14:07Z 32-bit time_t limit (Y2038)

このエポック値は偶然ではありません。2147483647 は符号付き 32 ビット整数が保持できる最大の数であり、この日付が重要である理由のすべてです。

日付を逆向きに読む

逆方向も同じくらい役に立ちます。ログから日付を貼り付けて、それが何かを調べます。形式が曖昧なとき(04/08 は世界の半分で曖昧です)、1 つに決め打ちせず、両方の読みを表示します。もともとのバグ報告は、決め打ちから生まれたものだからです。

$ chrono calc --analyze 04/08/2027
Chrono Mock - date analysis
  input:   04/08/2027  (ambiguous - month/day order differs by locale)
  US MM/DD/YYYY:  2027-04-08  (Thursday)
  PL DD/MM/YYYY:  2027-08-04  (Wednesday)

4 か月も離れており、曜日も違います。ISO 形式の日付は曖昧さがなく、そのとおりに読まれます。日付ですらないものは、推測されずに拒否されます。

文ではなく、ステップで組み立てる

時点とは、起点にステップを加えたものです。途中の結果は各ステップのあとに表示されるので、意外な答えを出す式でも、どこで曲がったかが分かります。ステップは 5 種類。単位によるずらし、時刻の設定、期間の境界へのスナップ、最も近い営業日への移動、別のタイムゾーンでの表し直しです。

# 年が変わる直前の最後の 1 秒
chrono calc --base today --snap eoy

# 90 営業日後、アメリカの銀行カレンダーで
chrono calc --base today --shift +90bd --calendar us-banking

# 18 年と 1 日前、年齢確認のため
chrono calc --base today --shift -18y --shift -1d

計算した日付はそのまま置き換えセッションに渡せます。--json なら同じ結果を機械向けの形式で出力します。テストする価値のある日付 →

試してみる