Skip to content

Latest commit

 

History

History
183 lines (149 loc) · 5.27 KB

README_ja.md

File metadata and controls

183 lines (149 loc) · 5.27 KB

The English document is here.

time-calculator - 時間の差を計算する簡易電卓

2つの使い方があります。

  1. 開始~終了時間を計算する簡易電卓(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"
    
  2. 時給の明細を作成(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 が利用可能になりました。

機能(API)

diff-time

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

分を指定して、時間に換算します。

(min-to-hour 292) => 4.866667 "hour"
  • ここで出てくる時間は、時給計算に便利なように10進数です。
  • 次の hour-by-decimal->hour-min 関数を使えば、「時間+分」に分解できます。

hour-by-decimal->hour-min

10進数での時間表現から、時間と分を得ます。

(hour-by-decimal->hour-min 1.25) => 1 15 ; 1.25h = 1h + 15min

ceiling-by-unit

指定した単位 (デフォルトは15) 区切りの数字に底上げし、15 分区切りになおします。

(ceiling-by-unit 1  15) => 15
(ceiling-by-unit 15 15) => 15
(ceiling-by-unit 16 15) => 30

report

複数の時間間隔を与えて、明細書を作成するアプリケーションです。 出力したいレポート形式は時と場合によって異なるため、デモ版と考え、以下の使用例を参考にカスタマイズしてください。

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

calc-time-span-to-min

時間表現から、分を割り出します。

このユーティリティは、時間計測の時に便利だと思う2通りの表現をサポートします。

  1. 直接的に分を表現
    (calc-time-span-to-min 234) => 234 "min"
    
  2. (diff-timeのように) 経過時間を表す2つの時間
    (calc-time-span-to-min "12:34-22:33") => 599 "min"
    

[TODO] MEMO time-or-num リーダーマクロについて

時間を毎回 "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"