times - Nimでの日付処理
Nimでの日付処理には、timesモジュールを用いる。
主な型
型 | 表すもの | 概要 |
---|---|---|
Time | 時刻 | UNIX時刻とナノ秒の2数だけで表すシンプルな時刻 |
DateTime | 時刻 | 年月日時分秒、タイムゾーン等を持つ多機能な時刻 |
Duration | 時間差 | ナノ秒単位での時刻差 |
TimeInterval | 時間差 | 様々な単位での時刻差 月による日数の違いや閏年などを考慮する必要があるときはこちら |
Timezone | タイムゾーン |
演算
時刻+時間差=時間、時刻-時刻=時間差、時間差*定数=時間差、時刻と時刻の比較、などの演算は揃っていて、直感的な`+`,`-`,`<`
などで記述できる。
文字列変換
- フォーマット文字列定義
import times # 文字列 => DateTime => UnixTime let s = "2018/01/01 12:34:56" let d = s.parse("yyyy/MM/dd HH:mm:ss") let u = d.toUnix # UnixTime => DateTime => 文字列 let u = 1514777696 let d = u.fromUnix let s = d.format("yyyy/MM/dd HH:mm:ss")
タイムゾーン
Nimは無骨にも、UTCとLOCAL以外のタイムゾーンは定義されていない。ので、自前で時差を計算してTimezoneを作成する。
用途が決まってたらLOCALでもいい(むしろその方がいい)例もあるだろうが、はっきりと「このゾーン!」と定義したい場合の話。
ZonedTimeというTimezone中間処理用の日付型を介するらしく、Timeを引数としてそれへ変換する関数を渡す必要がある。さらに普通のTimeが渡されたときの他にAdjTimeというよくわからん型用の関数も用意する必要があり(Timeと同じものでよい?)、「単に時差だけ指定すればOKにしてくれよ~」とか思うが、まぁサマータイムとかいろいろ面倒なんだろう。
# 変換用関数。日本時間の+09:00の場合、offsetは逆に-32400となる点に注意 proc jstInfo(time: Time): ZonedTime = ZonedTime(utcOffset: -32400, isDst: false, time: time) let jst = newTimezone("Asia/Tokyo", jstInfo, jstInfo)
ぶっちゃけ、文字列からの変換なら、後ろに“+09”付けて、フォーマット文字列にも「zz」付けた方が楽かも。
let s = "2018/01/01 12:34:56" let d = (s + "+09").parse("yyyy/MM/dd HH:mm:sszz")