74

Goで非標準の日付/時刻文字列を解析するにはどうすればよいですか。10/15/1983たとえば、文字列をtime.Time?に変換したい場合 このtime.Parse()関数を使用すると、フォーマットを指定できると思われます。

http://play.golang.org/p/v5DbowXt1x

package main

import "fmt"
import "time"

func main() {
    test, err := time.Parse("10/15/1983", "10/15/1983")
    if err != nil {
        panic(err)
    }

    fmt.Println(test)
}

これはパニックになります。

panic: parsing time "10/15/1983" as "10/15/1983": cannot parse "" as "0/"

論理的には、どちらが日でどちらが月であるかをどのように知ることができるので、それは理にかなっています。

他の言語には、次のような機能があります。

parse("mm/dd/yyyy", "10/15/1983")

Goのドキュメントでそのような関数が見つかりません。正規表現を選択するのは私の唯一の選択肢ですか?

4

4 に答える 4

169

time.Parseが探しているいくつかの重要な値があります。

変更することにより:

test, err := time.Parse("10/15/1983", "10/15/1983")

test, err := time.Parse("01/02/2006", "10/15/1983")

パーサーはそれを認識します。

これが遊び場で変更されたコードです。

package main

import "fmt"
import "time"

func main() {
    test, err := time.Parse("01/02/2006", "10/15/1983")
    if err != nil {
        panic(err)
    }

    fmt.Println(test)
}


src / pkg / time / format.goファイルの定数リストを利用して、独自の解析形式を作成できます。

const (
    stdLongMonth      = "January"
    stdMonth          = "Jan"
    stdNumMonth       = "1"
    stdZeroMonth      = "01"
    stdLongWeekDay    = "Monday"
    stdWeekDay        = "Mon"
    stdDay            = "2"
    stdUnderDay       = "_2"
    stdZeroDay        = "02"
    stdHour           = "15"
    stdHour12         = "3"
    stdZeroHour12     = "03"
    stdMinute         = "4"
    stdZeroMinute     = "04"
    stdSecond         = "5"
    stdZeroSecond     = "05"
    stdLongYear       = "2006"
    stdYear           = "06"
    stdPM             = "PM"
    stdpm             = "pm"
    stdTZ             = "MST"
    stdISO8601TZ      = "Z0700"  // prints Z for UTC
    stdISO8601ColonTZ = "Z07:00" // prints Z for UTC
    stdNumTZ          = "-0700"  // always numeric
    stdNumShortTZ     = "-07"    // always numeric
    stdNumColonTZ     = "-07:00" // always numeric
)

したがって、フォーマットで年を指定する場合は常に、「06」または「2006」で指定する必要があります。秒は「05」または「5」で指定し、タイムゾーンは「MST」、「Z0700」、「Z07:00」で指定します。 「、「-0700」、「-07」または「-07:00」。定数リストを参照すると、解析する必要のある標準形式をまとめることができます。

たとえば、Apacheがログファイルに使用する形式であるCommon Log Formatで日付/時刻を解析する場合は、次の文字列をレイアウト引数time.Parse()としてに渡します。

"02/Jan/2006:15:04:05 -0700"

「02」は日フィールド、「Jan」は月名フィールド、「2006」は年フィールド、「15」は24時間形式の時間フィールド、「04」は分フィールドを示します。 「05」は秒フィールドを示し、「-0700」はタイムゾーンフィールドを示します。

この形式では、現在のPST時刻が解析されます。31/Dec/2012:15:32:25 -0800

したがって、time.Parse()呼び出しは次のようになります。

test, err := time.Parse("02/Jan/2006:15:04:05 -0700", "31/Dec/2012:15:32:25 -0800")
于 2012-12-31T22:36:43.497 に答える
7

指定されたレイアウト ("2006-01-02T15:04:05.000Z") の数値を思い出せない場合は、Y のような MS Excel の規則を使用する私の単純な日付書式ライブラリgithub.com/metakeule/fmtdateを使用できます。 ,M,D,h を内部的に数値形式に変換します。

package main

import (
    "github.com/metakeule/fmtdate"

    "fmt"
)

func main() {
    test, err := fmtdate.Parse("MM/DD/YYYY", "10/15/1983")
    if err != nil {
        panic(err)
    }

    fmt.Println(test)
}
于 2015-05-02T08:25:46.253 に答える