2017-08-22 4 views
3

Ich arbeite mit einigen Daten aus mehreren Quellen und eine dieser Quellen ist ein Sage ERP-System.Parsing eine Zeit mit dem Format HHMMSS00

Ich versuche, zwei Dateien in Sage insbesondere ein Audit-Datum und Audit-Zeit (AUDTDATE und AUDTTIME) zu referenzieren.

Ich muss dies analysieren und es als DATETIME in einer Microsoft SQL Server-Datenbank speichern.

Momentan versuche ich nur herauszufinden, wie man das am besten parsen kann.

Ein Beispiel, wie die Daten unter aussehen könnte:

+----------+----------+ 
| AUDTDATE | AUDTTIME | 
+----------+----------+ 
| 20170228 | 5013756 | 
+----------+----------+ 

AUDTDATE ist ein yyyymmdd Format und die AUDTTIME ist HHMMSS00.

Also habe ich versucht, die unten als Test:

func main() { 
    value := "20170228 5013756" 
    layout := "20060102 15040500" 

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

Dies funktioniert nicht, es gibt nur 0001-01-01 00:00:00 +0000 UTC bei der Ausführung.

Wenn ich die Zeit auf diese 050137 und das Layout 150405 ändern dann funktioniert das gut:

func main() { 
    value := "20170228 050137" 
    layout := "20060102 150405" 

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

Eine Möglichkeit, dass ich mir vorstellen kann damit umgehen ist die Millisekunden ab vom Ende abzustreifen und dann überprüfen Sie die Länge und fügen Sie eine Null an den Anfang, wenn es einen braucht.

Dies scheint eine ziemlich hässliche Lösung und würde etwas zu tun, wie diese beinhalten:

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] 
} 

Gibt es eine Möglichkeit, dies zu tun, ohne durch die oben? Vielleicht nativ mit dem Zeitpaket?

Antwort

4

Unter der Annahme, dass Sie ziehen zurück 2 separate Werte aus der DB, Sie fmt.Sprintf-0 Pad timeString verwenden können. verwenden Sie es mit dem date String kombinieren, können Sie wie folgt vor:

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

In Ihrem Code:

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) 
} 

Ergebnisse: richtig Pad

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

Dieser Ansatz ist nützlich, weil es wird auch jeder kürzere Wert der Zeit, z 13756 wird in 00013756 konvertiert.

Die Funktion fmt.Sprintf ist nützlich, um Argumente in einer Zeichenfolge zu formatieren, wobei die von Ihnen gewünschte Formatierung verwendet wird, die durch eine Formatzeichenfolge und eine Liste von Argumenten angegeben wird (...interface{}). Die Formatzeichenfolge teilt der Funktion mit, wie die Argumente gerendert werden.

Dieses Format-String verwendet zwei weitere Anmerkungen:

  • String verb (%s): Das Format-String eine Vielzahl von verbs verwendet, die für String-Ersetzungen verwendet werden. %s ist speziell zum Rendern einer Zeichenfolge oder eines Slice. Andere beliebte Verben sind %d für die Basis 10 Integer und %f für Float mit einer vollständigen Liste in der Dokumentation. Das Verb ist sehr nützlich und kann auch hier verwendet werden, da es den Standardwert eines Arguments darstellt.
  • 0 link padding: Um 0 linken Pad ein Argument, verwenden Sie 0 gefolgt von einer Länge Nummer im Verb nach der %. Dies wird dem Argument mit einer maximalen Anzahl von 0 s vorangestellt, die in der Längennummer spezifiziert sind. Beispielsweise wird %08s eine Zeichenfolge mit bis zu 8 vorangestellten Nullen wiedergeben. Dies bedeutet, dass eine Zeichenfolge """00000000" ist, während eine Zeichenfolge "1234567" in "" resultiert. Wenn die Zeichenfolge länger als die Länge ist, wird nichts vorangestellt.

Aus der Dokumentation:

%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 

Detailliertere ist in der Dokumentation zur Verfügung: https://golang.org/pkg/fmt/

+0

Dieses wie eine viel elegantere Lösung aussieht. 'fmt.Sprintf ("% s% 08s ", date, timeString)" Würde es Ihnen etwas ausmachen, dies ein wenig mehr zu erklären - ich versuche nur ein wenig mehr zu verstehen "% s% 08s" '. Ich gehe davon aus, dass "% s" das Datum ausgibt, wenn es übergeben wird, und "% 08s" gibt die Zeit aus, wenn es mit führenden Nullen mit bis zu 8 Zeichen Länge übergeben wird. Ist das korrekt? – James

+2

Das ist richtig. Ich habe die Antwort aktualisiert, um mehr zu erklären. Wie bereits erwähnt, ist dies hier nützlich, da es zu der richtigen Zeitlänge führt, auch wenn mehr als eine "0" benötigt wird. Die "% s" und "% 08s" geben beide an, dass die Werte Zeichenfolgen sind, wobei "% 08s" angibt, dass eine Zeichenfolge mit bis zu 8 Nullen vorangestellt werden soll. In dieser speziellen Instanz kann "% v% 08v" auch verwendet werden, weil "% v" angibt, einen Standardwert des Arguments zu verwenden. '% v' kann für jede Struktur verwendet werden, aber es ist nett, genauer zu sein, wenn Sie können,'% s' hier. – Grokify

+0

Danke für die ausführliche Erklärung! Sehr hilfreich. Ich bin ziemlich neu in Go und das ist sehr hilfreich. – James