【Go】日付かどうかのチェックを行う
お久しぶりです。どうもkazuです。
最近は台風に負けてばっかしで外に行けなくて凹んでいます。(ギアはたくさん買った)
たまにはエンジニアっぽい記事を書かなければ…と思い、本日はGoについてです。
Go言語を勉強する際にUtilクラスを自分で書いてみようと思い、作ったものの一部を載せておきます。
Goで日付の処理をJavaっぽく書く。イメージとしてはtry catchで判定するイメージ
import ( "fmt" "regexp" "time" ) func main() { // 日付かどうかチェックする fmt.Println(check("20190905")) } // チェック処理 func check(dateStr string) bool { // 削除する文字列を定義 reg := regexp.MustCompile(`[-|/|:| | ]`) // 指定文字を削除 str := reg.ReplaceAllString(dateStr, "") // 数値の値に対してフォーマットを定義 format := string([]rune("20060102150405")[:len(str)]) // パース処理 → 日付ではない場合はエラー _, err := time.Parse(format, str) return err == nil }
Goの特徴として、日付のフォーマットを行う際は[20060102150405]という値がお決まりです。
これはアメリカの時刻表記(01/02 03:04:05 2006)からきているそうで、日本人にはある程度の慣れが必要ですね。
以下、チェックの結果です。
package main import ( "fmt" "regexp" "time" ) func main() { // 日付である場合 fmt.Println(check("20190905")) fmt.Println(check("2019090508")) fmt.Println(check("20190905122001")) fmt.Println(check("2019-09-05")) fmt.Println(check("2019/09/01/12:23:59")) fmt.Println(check("2019/09/01/23:23:59")) fmt.Println(check("2000-02-29")) // 以下、falseが返る // 足りない fmt.Println(check("201")) // 存在しない日付 fmt.Println(check("2019-09-00")) // 間違った閏日 fmt.Println(check("20190229")) // 文字列 fmt.Println(check("aaaaa")) // 時間が間違っている fmt.Println(check("2019/09/01/25:23:59")) // 0→O fmt.Println(check("2O19-O9-O1")) } // チェック処理 func check(dateStr string) bool { // 削除する文字列を定義 reg := regexp.MustCompile(`[-|/|:| | ]`) // 指定文字を削除 str := reg.ReplaceAllString(dateStr, "") // 数値の値に対してフォーマットを定義 format := string([]rune("20060102150405")[:len(str)]) // パース処理 → 日付ではない場合はエラー _, err := time.Parse(format, str) return err == nil }
Goの場合は戻り値が複数あるので、こういったUtilにしなくともエラーハンドリングを個別でやる方が安全な様にも思います。