tkuchikiの日記

新ブログ https://blog.tkuchiki.net

時刻文字列をいい感じに parse する Go の package

parsetime という時刻文字列をいい感じに parse する Go のライブラリを書きました。

Example

使用例です。

package main

import (
    "fmt"
    "github.com/tkuchiki/parsetime"
    "log"
)

func main() {
    p, err := parsetime.NewParseTime()
    if err != nil {
        log.Fatal(err)
    }

    t, err2 := p.Parse("2016-01-02T03:04:05")

    if err2 != nil {
        log.Fatal(err)
    }


    // Local timezone: JST
    // 2016-01-02 03:04:05 +0900 JST
    fmt.Println(t)
}

以下、NewParseTimeParse の説明です。

NewParseTime

NewParseTime は 0 ~ 2 の引数を指定可能です。
引数を指定しなければ local の *time.Location をセットした状態の time.Time を返します。
第一引数には *time.LocationAsia/TokyoJST のような文字列を指定できます。
Asia/Tokyo のような文字列を指定した場合は、
time.LoadLocation して *time.Location をセットします。
JST のような文字列を指定した場合は、
その文字列から offset を取得して time.FixedZone を実行します。
第一、二引数に JST のような文字列、offset を指定した場合も time.FixedZone を実行します。

ParseTime 構造体には、SetLocation というメソッドを用意しているので、あとから変更することも可能です。

Parse

Parse に時刻文字列を指定すると、time.Timeerror を返します。
Parse は、time.Parse ではなく、正規表現でキャプチャして time.Date を使う実装になっています。
最初に実装した時は、time.Parse の format を大量に用意しておいて、
parse できるまでループで回していたのですが、正規表現を使ったほうが柔軟に対応できそうだったので実装しなおしました。
15:04 のように、時、分だけ指定した場合、実行した年月日を設定した time.Time を返すようになっています
(time.Parse をループで回していたときはこれができていませんでした)。
対応している文字列は、ISO8601、RFC 3339、RFC822, RFC850, RFC1123 などです。
01/02/2006 15:04:0511:04 PMJan 2, 2006 at 3:04am (MST) のような形式にも対応しています。

parse 可能な時刻文字列の例は https://github.com/tkuchiki/parsetime#examples を参考にしてください。