2016-12-02 189 views
0

我正在解析從遊戲中解析日誌文件的解析器,因此我可以對遊戲內進行的拍賣進行分析,但是由記錄器寫入的日期格式似乎導致問題,因爲格式似乎對記錄儀進行定製編寫的,一個例子日期時間戳的樣子:[Wed Nov 23 23:26:10 2016]我嘗試分析它:Golang解析奇怪的日期格式

func (r *AuctionReader) extractSaleInformation(line string) { 
    fmt.Println("Extracting information from: ", line) 

    // Format mask for output 
    layout := "DD-MM-YYYY hh:mm:ss" 

    // Replace the square brackets so we're just left with the date-time string 
    date := strings.TrimSpace(strings.Replace((strings.Split(line, "]")[0]), "[", "", -1)) 

    fmt.Println(time.Parse(date, layout)) 
} 

當我嘗試分析上面的日期時間字符串,我得到以下錯誤:

0001-01-01 00:00:00 +0000 UTC parsing time "DD-MM-YYYY hh:mm:ss" as "Wed Nov 23 23:26:10 2016": cannot parse "DD-MM-YYYY hh:mm:ss" as "Wed Nov "

我怎麼能得到pa rser來識別這個看似自定義的格式,我將這個數據保存到Mongo中,所以我不想將拍賣時間存儲爲字符串,因爲我想單獨查詢時間戳。

回答

2

Golang以獨特的方式處理所有日期格式 - 它使用參考時間Mon Jan 2 15:04:05 MST 2006(01/02 03:04:05 PM '06 -0700)來顯示格式化/解析給定時間/字符串的模式。

所以,閱讀格式「週三11月23日23點26分10秒2016」你會把基準日到該格式爲:「週一1月2日15時04分05秒2006」,然後執行:

t, _ := time.Parse("Mon Jan 2 15:04:05 2006", "Wed Nov 23 23:26:10 2016") 

然後,在給定的格式輸出它,如果你想要的格式DD-MM-YYYY hh:mm:ss,你會把參考時間轉換爲這種格式:02-01-2006 15:04:05,然後執行:

t.Format("02-01-2006 15:04:05") 

https://play.golang.org/p/VO5413Z7-z

所以基本上,主要的變化是

// Format mask for output 
layout := "DD-MM-YYYY hh:mm:ss" 

應該

// Format mask for output 
layout := "02-01-2006 15:04:05" 

time.Parse(date, layout) 

應該

time.Parse(layout, date) 
+0

另一個 '主變' 將被調換'日期'和'佈局'參數到'ti me.Parse' – Gavin

+0

嗨戴夫,這工作完美 - 感謝您的幫助:) – Alex