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ドキュメントでそのような関数を見つけることができません。正規表現の唯一の選択肢はありますか?
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")
指定するレイアウト( "2006-01-02T15:04:05.000Z")の数値を思い出せない場合は、単純な日付フォーマットライブラリ github.com/metakeule/fmtdate を使用できます。 Y、M、D、hなどのMS Excelの規則を使用し、内部的に数値形式に変換します。
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)
}