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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA