時刻文字列をいい感じに 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) }
以下、NewParseTime
と Parse
の説明です。
NewParseTime
NewParseTime
は 0 ~ 2 の引数を指定可能です。
引数を指定しなければ local の *time.Location
をセットした状態の time.Time を返します。
第一引数には *time.Location
と Asia/Tokyo
や JST
のような文字列を指定できます。
Asia/Tokyo
のような文字列を指定した場合は、
time.LoadLocation
して *time.Location
をセットします。
JST
のような文字列を指定した場合は、
その文字列から offset を取得して time.FixedZone
を実行します。
第一、二引数に JST
のような文字列、offset を指定した場合も time.FixedZone
を実行します。
ParseTime
構造体には、SetLocation
というメソッドを用意しているので、あとから変更することも可能です。
Parse
Parse
に時刻文字列を指定すると、time.Time
と error
を返します。
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:05
や11:04 PM
、Jan 2, 2006 at 3:04am (MST)
のような形式にも対応しています。
parse 可能な時刻文字列の例は https://github.com/tkuchiki/parsetime#examples を参考にしてください。