。解析時間,我正在與一些數據來自多個來源的工作,這些來源之一是賢者ERP系統的格式HHMMSS00
我想在Sage中引用兩個文件,特別是審計日期和審計時間(AUDTDATE
和AUDTTIME
)。
我需要解析這個並將其存儲爲在Microsoft SQL Server數據庫的DATETIME。
目前,我只是試圖找出解析是最好的方法。
的數據可能看起來像下面是一個例子:
+----------+----------+
| AUDTDATE | AUDTTIME |
+----------+----------+
| 20170228 | 5013756 |
+----------+----------+
AUDTDATE
是YYYYMMDD格式和AUDTTIME
是HHMMSS00。
所以,我想下面的測試:
func main() {
value := "20170228 5013756"
layout := "20060102 15040500"
t, _ := time.Parse(layout, value)
fmt.Println(t)
}
這是不行的,它只是返回0001-01-01 00:00:00 +0000 UTC
運行時。
如果我改變的時候這個050137
和佈局150405
那麼這工作得很好:
func main() {
value := "20170228 050137"
layout := "20060102 150405"
t, _ := time.Parse(layout, value)
fmt.Println(t)
}
一,我能想到的解決這個問題的方法是從最終剝離毫秒關閉,然後檢查長度並在需要時添加一個零到開頭。
這似乎是一個非常醜陋的解決方案,並會涉及到做這樣的事情:
func main() {
date := "20170228"
timeString := "5013756"
value := date + prepareTime(timeString)
layout := "20060102150405"
t, _ := time.Parse(layout, value)
fmt.Println(t)
}
func prepareTime(time string) string {
if len(time) == 7 {
time = "0" + time
}
return time[:6]
}
有沒有辦法做到這一點,而無需通過上面去?也許本機與時間包?
這看起來像一個更好的解決方案。 'fmt.Sprintf(「%s%08s」,date,timeString)'''''''''''''''''''''''''''您介意再多加一點解釋 - 我只是想更多地理解'%s%08s'。我假定'%s'輸出日期,'%08s'輸出時間,因爲它是以前導零長度最多8個字符傳入的。那是對的嗎? – James
這是正確的。我已經更新了答案,以包含更多的解釋。如前所述,這在這裏很有用,因爲它會導致正確的時間長度,即使需要多個「0」。 '%s'和'%08s'都表示這些值是字符串,'%08s'表示預先添加了一個最多包含8個零的字符串。在這個特殊的例子中,'%v%08v''也可以使用,因爲'%v'表示使用參數的默認值。 '%v'可以用於任何結構體,但是當你可以''s''的時候更加具體。 – Grokify
感謝您的詳細解釋!很有用。我對Go很新,這非常有幫助。 – James