【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にしなくともエラーハンドリングを個別でやる方が安全な様にも思います。