Schemeには日付と時間を扱うSRFIがある。SRFI-19である。多くの場合はこのSRFIで事足りるのだが、局所時間を扱う際にこまることがある。例えば上記の日付をタイムゾーンを気にせず表せない。
;; これはエラー (make-date 0 0 10 11 4 1 2018 #f) ;; これは常にUTC (make-date 0 0 10 11 4 1 2018 0) ;; これだと常にUTC+1:00、夏時間どうする? (make-date 0 0 10 11 4 1 2018 3600)とりあえず全ての日付はUTC+0にして扱うという手もあるのだが、バッチ処理を日付が変わるときに行うというようなことが面倒になる。また、このSRFIには日付のみ、時間のみを扱う術がない。例えば11時15分という時間と
(make-date 0 0 15 11 0 0 0 0)
は等価か?あるいは2018年1月4日は(make-date 0 0 0 0 4 1 2018 0)
と等価であるかということである。答えはケースバイケースであるとは思うが、多くの場合はNoではないだろうか?Javaは1.8からjava.timeというパッケージが導入された。これは上記のようなジレンマを解決してくれそうな雰囲気がある(使ったことないので未確認)。Sagittariusにもこれと似たようなものを入れるべきかなぁと考えている。こんな感じでの階層だろうか?
+-------+ +-------+ | date | | time | +---+---+ +---+---+ | | +-----+-----+ | +-----+-----+ +-------------+ | date-time | | zone-offset | +-----+-----+ +------+------+ | | +-------+--------+ | +----------+----------+ | offsetted-date-time | <-- SRFI-19 dateと等価 +---------------------+時間が常にローカル時間かというのはわからないので、
offsetted-time
みたいなのもあっていいかもしれない。time
だと名前が被るから別名にする必要も有りそうだが。ちょっと考える必要があるが、割と早めに導入したい気持ちもある。
追記
Shiroさんのアイデア
で、日付によらない時間(H,M,S)の演算をclockと考えよう、と思ったんですが、calendarにH,M,Sを持たせても良い気がしてきました。7時間の5倍を35時間と扱うか1日と11時間と扱うか、も同じものの表現が複数あると考えればいいし…そうするとsrfi-19 dateはcalendarのD=(y,m,d,H,M,S)の正規形+TZですね。— Shiro Kawai (@anohana) 4 January 2018
これを使ってSRFI-19を実装するとすると、Calendarは3つ必要になりそう。(たぶん)Gregorian、JulianとModified Julian。内Julian calendarとModified Julian calendarは要らんかもしれんが、あると綺麗っぽい。これを踏まえると以下のようにするといいだろうか?
+------------+ | timezone | +------------+ | - Offset | +------+-----+ +------------+ | | date | | +------------+ | | - timezone |<>---------+ +------------+ | - calendar |<>------------+ | date-tuple | +------------+ | +------------+ +----------+----------+ | -(Y,M,D) | | calendar | +-----+------+ +---------------------+ | | - YMD: date-tuple |<>--------+ | - HmS: time-tuple |<>--------+ +---------------------+ | +-----+------+ | time-tuple | +------------+ | -(H,m,S) | +------------+calendarは演算手続きの集合にして、こうした方がいいだろうか?
+--------------+ +------------+ +------------+ | calendar | | date-tuple | | time-tuple | +--------------+ +------------+ +------------+ | - operations | | - (Y,M,D) | | - (H,m,S) | +------+-------+ +------+-----+ +------+-----+ | | | | +-------------------+ | | | | local-date | | | | +-------------------+ | | | | - YMD: date-tuple |<>-------------+ | +-----------<>| - calender | | | +-------------------+ | | | | +-------------------+ | | | local-time | | | +-------------------+ | | | - HmS: time-tuple |<>----------------------------+ +-----------<>| - calendar | +-------------------+ : so on :どっちもしっくりこない感じがするなぁ。もう少し考える必要がありそうだ。
No comments:
Post a Comment