2つの使い方があります。
- 開始~終了時間を計算する簡易電卓(time-calculator.lisp)
TC> (diff-time "16:46" "18:24") ; 98 "min" TC> (min-to-hour 98) ; 1.6333333 "hour" TC> (hour-by-decimal->hour-min 1.6333333) => 1 "hour" + 38 "min" TC> (min-to-hour (+ (diff-time "16:46" "18:24") ; 98 "min" (diff-time "11:32" "14:46") ; 194 "min" 30)) ; 98 + 194 + 30 = 322 = 5.366667 "hour" => 5.366667 "hour"
- 時給の明細を作成(report.lisp)
TC> (setq *unit-price* 3000) ; 時給 TC> (report "@harupiyo Common Lisp でtime-calclulator 作り" "14:18-15:46" "16:33-17:28" "21:09-21:44" "21:51-21:55" 322 "22:03-22:18" "11:10-11:14" "11:57-12:02" "12:09-12:20" "09:49-10:00" ) 【ご請求】¥27,750 (9時間15分) @harupiyo Common Lisp でtime-calclulator 作り ----- - 14:18-15:46 ... 88分 - 16:33-17:28 ... 55分 - 21:09-21:44 ... 35分 - 21:51-21:55 ... 4分 - 322分 - 22:03-22:18 ... 15分 - 11:10-11:14 ... 4分 - 11:57-12:02 ... 5分 - 12:09-12:20 ... 11分 - 09:49-10:00 ... 11分 ----- total: 550分 ==(15分単位)==> 555分 / 9時間15分(*1) ご利用料金: (*1) x ¥3,000 = ¥27,750 NIL
ASDFの標準フォルダである ~/common-lisp/
もしくは ~/.local/share/common-lisp/source/
下に git clone
します。
$ git clone https://github.com/harupiyo/time-calculator.git ~/common-lisp/time-calculator
REPLを起動したら、Quicklispを使ってシステムを読み込ませます。
CL-USER> (ql:quickload :time-calculator)
CL-USER> (in-package :tc) ; tc は time-calculator のニックネームです
TC>
REPLから time-calculator のAPI が利用可能になりました。
2つの時間の差を分で返します。
(diff-time "16:46" "18:24") => 98 "min"
(diff-time "18:24" "16:46") => 98 "min" ; 2つの時間は、どちらが先でもかまいません
(diff-time "23:50" "25:10") => 80 "min" ; 日をまたいだ計算をしたい時には24:00 以降の時間を指定してください
分を指定して、時間に換算します。
(min-to-hour 292) => 4.866667 "hour"
- ここで出てくる時間は、時給計算に便利なように10進数です。
- 次の hour-by-decimal->hour-min 関数を使えば、「時間+分」に分解できます。
10進数での時間表現から、時間と分を得ます。
(hour-by-decimal->hour-min 1.25) => 1 15 ; 1.25h = 1h + 15min
指定した単位 (デフォルトは15) 区切りの数字に底上げし、15 分区切りになおします。
(ceiling-by-unit 1 15) => 15
(ceiling-by-unit 15 15) => 15
(ceiling-by-unit 16 15) => 30
複数の時間間隔を与えて、明細書を作成するアプリケーションです。 出力したいレポート形式は時と場合によって異なるため、デモ版と考え、以下の使用例を参考にカスタマイズしてください。
TC> (setq *unit-price* 3000) ; 時給を設定
TC> (report "@harupiyo Common Lisp でtime-calclulator 作り"
"14:18-15:46"
"16:33-17:28"
"21:09-21:44"
"21:51-21:55"
322
"22:03-22:18"
"11:10-11:14"
"11:57-12:02"
"12:09-12:20"
"09:49-10:00"
)
【ご請求】¥27,750 (9時間15分) @harupiyo Common Lisp でtime-calclulator 作り
-----
- 14:18-15:46 ... 88分
- 16:33-17:28 ... 55分
- 21:09-21:44 ... 35分
- 21:51-21:55 ... 4分
- 322分
- 22:03-22:18 ... 15分
- 11:10-11:14 ... 4分
- 11:57-12:02 ... 5分
- 12:09-12:20 ... 11分
- 09:49-10:00 ... 11分
-----
total: 550分 ==(15分単位)==> 555分 / 9時間15分(*1)
ご利用料金: (*1) x ¥3,000 = ¥27,750
NIL
時間表現から、分を割り出します。
このユーティリティは、時間計測の時に便利だと思う2通りの表現をサポートします。
- 直接的に分を表現
(calc-time-span-to-min 234) => 234 "min"
- (diff-timeのように) 経過時間を表す2つの時間
(calc-time-span-to-min "12:34-22:33") => 599 "min"
時間を毎回 "12:34" とクォートで表現するのは面倒なので、 12:34 のようにリテラルで表現できないか試みたものです。 (現状、スマートに解決できていません。将来取り組むべき TODO としてメモしておきます。)
REPLで独自のリテラル記法を持ち込むのはリーダーマクロを利用します。 リーダーマクロの機構上、先導する接頭辞「'#'と一文字」が必要です。 したがって 「"12:34"」を「12:34」にしたかったところ、接頭辞を付けた表現の「#t12:34」となりました。
time-or-num リーダーマクロの利用例を示します。
TC> (diff-time #t10:30 #t10:00)
=> 30
"min"
[TODO] 次のようにしたいものです。
TC> (diff-time 10:30 10:00)
=> 30
"min"