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)