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")

programming/nim/datetime.txt · 最終更新: 2018/10/23 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0