2017-08-22 44 views
3

解析時間,我正在與一些數據來自多個來源的工作,這些來源之一是賢者ERP系統的格式HHMMSS00

我想在Sage中引用兩個文件,特別是審計日期和審計時間(AUDTDATEAUDTTIME)。

我需要解析這個並將其存儲爲在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] 
} 

有沒有辦法做到這一點,而無需通過上面去?也許本機與時間包?

回答

4

假設你正在從數據庫中拉了回來2個獨立的值,可以使用fmt.Sprintf0timeString。與date字符串相結合,你可以使用以下命令:

value := fmt.Sprintf("%s %08s", date, timeString)[:15] 

在您的代碼:

func main() { 
    date := "20170228" 
    timeString := "5013756" 
    value := fmt.Sprintf("%s %08s", date, timeString)[:15] 
    layout := "20060102 150405" 

    t, _ := time.Parse(layout, value) 
    fmt.Println(t) 
} 

結果:

2017-02-28 05:01:37 +0000 UTC 

這種方法是有用的,因爲它也將正確地墊任何更短的時間值,例如13756將被轉換爲00013756

fmt.Sprintf函數對於使用格式化字符串和參數列表(...interface{})指定的格式來將參數格式化爲字符串非常有用。格式字符串告訴函數如何呈現參數。

這個格式字符串使用說明的兩個項目:

  • 字符串動詞(%s):格式字符串使用各種verbs被用於字符串替換。 %s專門用於呈現字符串或切片。其他流行動詞包括%d(基數爲10的整數)和%f(浮點數),其中包含文檔中的完整列表。 %v動詞是非常有用的,因爲它會呈現參數的默認值,所以也可以在這裏使用。
  • 0左邊距填充:對於0左邊填充參數,使用0後跟%後面的動詞長度數字。這將在該長度編號中指定最大數量爲0的參數。例如,%08s將呈現一個最多包含8個預置零的字符串。這意味着字符串""將爲"00000000",而字符串"1234567"將導致""。如果字符串比長度長,則不會有前綴。

從文檔:

%s the uninterpreted bytes of the string or slice 

0 pad with leading zeros rather than spaces; 
    for numbers, this moves the padding after the sign 

更詳細的,請在文檔中:https://golang.org/pkg/fmt/

+0

這看起來像一個更好的解決方案。 'fmt.Sprintf(「%s%08s」,date,timeString)'''''''''''''''''''''''''''您介意再多加一點解釋 - 我只是想更多地理解'%s%08s'。我假定'%s'輸出日期,'%08s'輸出時間,因爲它是以前導零長度最多8個字符傳入的。那是對的嗎? – James

+2

這是正確的。我已經更新了答案,以包含更多的解釋。如前所述,這在這裏很有用,因爲它會導致正確的時間長度,即使需要多個「0」。 '%s'和'%08s'都表示這些值是字符串,'%08s'表示預先添加了一個最多包含8個零的字符串。在這個特殊的例子中,'%v%08v''也可以使用,因爲'%v'表示使用參數的默認值。 '%v'可以用於任何結構體,但是當你可以''s''的時候更加具體。 – Grokify

+0

感謝您的詳細解釋!很有用。我對Go很新,這非常有幫助。 – James