Gauche:日時の加算
タイムスタンプの生成
- タイムスタンプを、時間をずらして、たくさん作りたいときがありました。
- 最初、<date> クラスで加算しようとしたのですが、見つからず、
加算は <time> クラスで行うようでした。
- <time> クラスには、time-utc や time-duration といった種別があって、
make-time の引数で、タイプを指定します。
加算する時間は、time-duration である必要があります。
- string->date および date->string は、
~z でタイムゾーン ( +0900 等 ) を読み書きできますが、
date->time-utc で変換すると、タイムゾーンの情報は失われるようです。
そして、time-utc->date では、PC のローカルタイムゾーンの値がセットされるようです。
(その後、リファレンスマニュアルを見たら、
Function: time-utc->date time :optional tz-offset とのことで、
省略可能引数で、タイムゾーンのオフセット値を、秒単位で指定可能でした)
- 結構、分かるまでに苦労したので、メモしておきます。
(use srfi-19) (define N 10) (define date1 (string->date "2020-02-28T00:00:00+0900" "~Y-~m-~dT~H:~M:~S~z")) (define duration1 (make-time 'time-duration 0 (* 6 60 60))) ; 6hr (define time1 #f) (do ((i 1 (+ i 1))) ((> i N)) (print (date->string date1 "~Y-~m-~dT~H:~M:~S~z")) (set! time1 (date->time-utc date1)) (set! time1 (add-duration time1 duration1)) (set! date1 (time-utc->date time1)))
時間の加算
- 以下は、時間を加算して、合計時間を出力するサンプルです。
- (こちらも、最初は、<date> クラスや <time> クラスで試行錯誤していたのですが、
結局、普通に数値で計算するだけでよかった)
(define work-time-list '( 7:45 6:00 5:30 7:15 )) (define total-hours 0) (for-each (lambda (time1) (rxmatch-cond ((#/^(\d+):(\d+)$/ (x->string time1)) (#f hours minutes) (inc! total-hours (+ (x->number hours) (/. (x->number minutes) 60)))) (else (errorf "invalid time found : ~a" time1)))) work-time-list) (format #t "~%total-hours = ~a~%" total-hours)
日時の計算を行うモジュール
- その後、日時の計算を行うモジュール datecal を作成してみました。
hamayama(2022/02/28 12:36:39 UTC)(2022/03/06 02:00:28 UTC)
(2022/03/06 23:36:57 UTC)(2022/09/19 12:51:20 UTC)