Time.Time in String konvertieren

102

Ich versuche, einige Werte aus meiner Datenbank zu einem []stringin Go hinzuzufügen . Einige davon sind Zeitstempel.

Ich bekomme den Fehler:

U.Created_date (Typ time.Time) kann nicht als Typzeichenfolge im Array-Element verwendet werden

Kann ich konvertieren time.Timezu string?

type UsersSession struct {
    Userid int
    Timestamp time.Time
    Created_date time.Time
}

type Users struct {
    Name string
    Email string
    Country string
    Created_date time.Time
    Id int
    Hash string
    IP string
}

- -

var usersArray = [][]string{}

rows, err := db.Query("SELECT u.id, u.hash, u.name, u.email, u.country, u.IP, u.created_date, us.timestamp, us.created_date FROM usersSession AS us LEFT JOIN users AS u ON u.id = us.userid WHERE us.timestamp + interval 30 minute >= now()")

U := Users{}
US := UsersSession{}

for rows.Next() {
    err = rows.Scan(&U.Id, &U.Hash, &U.Name, &U.Email, &U.Country, &U.IP, &U.Created_date, &US.Timestamp, &US.Created_date)
    checkErr(err)

    userid_string := strconv.Itoa(U.Id)
    user := []string{userid_string, U.Hash, U.Name, U.Email, U.Country, U.IP, U.Created_date, US.Timestamp, US.Created_date}
    // -------------
    // ^ this is where the error occurs
    // cannot use U.Created_date (type time.Time) as type string in array element (for US.Created_date and US.Timestamp aswell)
    // -------------

    usersArray = append(usersArray, user)
    log.Print("usersArray: ", usersArray)
}

BEARBEITEN

Ich habe folgendes hinzugefügt. Es funktioniert jetzt, danke.

userCreatedDate := U.Created_date.Format("2006-01-02 15:04:05")
userSessionCreatedDate := US.Created_date.Format("2006-01-02 15:04:05")
userSessionTimestamp := US.Timestamp.Format("2006-01-02 15:04:05")
ANZEIGE
quelle
Es ist hervorzuheben, dass der Compilerfehler den Fehler vollständig beschreibt. Sie können keinen Typ Time in ein Array von Zeichenfolgen einfügen.
Ben Campbell

Antworten:

159

Sie können die Verwendung Time.String()Methode ein konvertieren time.Timezu einem string. Dies verwendet die Formatzeichenfolge "2006-01-02 15:04:05.999999999 -0700 MST".

Wenn Sie ein anderes benutzerdefiniertes Format benötigen, können Sie es verwenden Time.Format(). Um beispielsweise den Zeitstempel im Format der yyyy-MM-dd HH:mm:ssVerwendung zu erhalten, verwenden Sie die Formatzeichenfolge "2006-01-02 15:04:05".

Beispiel:

t := time.Now()
fmt.Println(t.String())
fmt.Println(t.Format("2006-01-02 15:04:05"))

Ausgabe (versuchen Sie es auf dem Go-Spielplatz ):

2009-11-10 23:00:00 +0000 UTC
2009-11-10 23:00:00

Hinweis: Die Zeit auf dem Go-Spielplatz ist immer auf den oben angegebenen Wert eingestellt. Führen Sie es lokal aus, um das aktuelle Datum und die aktuelle Uhrzeit anzuzeigen.

Beachten Sie auch, dass Sie Time.Format()als Layout stringimmer dieselbe Zeit verwenden müssen - die Referenzzeit genannt -, die so formatiert ist, dass das Ergebnis formatiert werden soll. Dies ist dokumentiert unter Time.Format():

Format gibt eine Textdarstellung des gemäß Layout formatierten Zeitwerts zurück, die das Format definiert, indem gezeigt wird, wie die Referenzzeit definiert ist

Mon Jan 2 15:04:05 -0700 MST 2006

würde angezeigt werden, wenn es der Wert wäre; es dient als Beispiel für die gewünschte Ausgabe. Die gleichen Anzeigeregeln werden dann auf den Zeitwert angewendet.

icza
quelle
21
Nur um es klar zu machen. Um ein benutzerdefiniertes Zeitformat zu übergeben, müssen Sie den Zeitwert verwenden Mon Jan 2 15:04:05 -0700 MST 2006und diese Zeit in das gewünschte Format eingeben. Go wird das Format verstehen, wenn Sie es mit diesem Wert übergeben haben. Sie können keinen anderen Zeitwert verwenden. Ich brauchte einige Zeit, um das herauszufinden und dachte daran, es als Kommentar hinzuzufügen
Ahmed Essam
@AhmedEssam Danke, habe das in die Antwort aufgenommen.
icza
19
package main                                                                                                                                                           

import (
    "fmt"
    "time"
)

// @link https://golang.org/pkg/time/

func main() {

    //caution : format string is `2006-01-02 15:04:05.000000000`
    current := time.Now()

    fmt.Println("origin : ", current.String())
    // origin :  2016-09-02 15:53:07.159994437 +0800 CST

    fmt.Println("mm-dd-yyyy : ", current.Format("01-02-2006"))
    // mm-dd-yyyy :  09-02-2016

    fmt.Println("yyyy-mm-dd : ", current.Format("2006-01-02"))
    // yyyy-mm-dd :  2016-09-02

    // separated by .
    fmt.Println("yyyy.mm.dd : ", current.Format("2006.01.02"))
    // yyyy.mm.dd :  2016.09.02

    fmt.Println("yyyy-mm-dd HH:mm:ss : ", current.Format("2006-01-02 15:04:05"))
    // yyyy-mm-dd HH:mm:ss :  2016-09-02 15:53:07

    // StampMicro
    fmt.Println("yyyy-mm-dd HH:mm:ss: ", current.Format("2006-01-02 15:04:05.000000"))
    // yyyy-mm-dd HH:mm:ss:  2016-09-02 15:53:07.159994

    //StampNano
    fmt.Println("yyyy-mm-dd HH:mm:ss: ", current.Format("2006-01-02 15:04:05.000000000"))
    // yyyy-mm-dd HH:mm:ss:  2016-09-02 15:53:07.159994437
}    
Hao
quelle
1
Wenn ich fmt.Println (time.Now (). Format ("2017/20/01 13:53:35")) versuche, werde ich seltsam 21017/210/01 112: 3012: 1230
21.
3
Verwenden Sie fmt.Println (time.Now (). Format ("2006/01/02 15:04:05")), da die Formatzeichenfolge festgelegt ist. Es ist "2006 01 02 15 04 05"
Hao
2

Gehen Sie zum Spielplatz http://play.golang.org/p/DN5Py5MxaB

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.Now()
    // The Time type implements the Stringer interface -- it
    // has a String() method which gets called automatically by
    // functions like Printf().
    fmt.Printf("%s\n", t)

    // See the Constants section for more formats
    // http://golang.org/pkg/time/#Time.Format
    formatedTime := t.Format(time.RFC1123)
    fmt.Println(formatedTime)
}
firebitsbr
quelle
Wenn ich fmt.Println (time.Now (). Format ("2017/20/01 13:53:35")) versuche, werde ich seltsam 21017/210/01 112: 3012: 1230
21.
weil du 20 machst, was für go nicht aussagekräftig ist, ist 2 das Datum, das wahrscheinlich zu diesem Zeitpunkt 21 war, und die zusätzliche 0 wird nur @irom
nikoss
1

Die einfache Lösung zum Erstellen des Datums- und Uhrzeitformats finden Sie in Go Lang. Das folgende Beispiel finden Sie unten.

Paketlink: https://github.com/vigneshuvi/GoDateFormat .

Bitte finden Sie die Plackhalter: https://medium.com/@Martynas/formatting-date-and-time-in-golang-5816112bf098

package main


// Import Package
import (
    "fmt"
    "time"
    "github.com/vigneshuvi/GoDateFormat"
)

func main() {
    fmt.Println("Go Date Format(Today - 'yyyy-MM-dd HH:mm:ss Z'): ", GetToday(GoDateFormat.ConvertFormat("yyyy-MM-dd HH:mm:ss Z")))
    fmt.Println("Go Date Format(Today - 'yyyy-MMM-dd'): ", GetToday(GoDateFormat.ConvertFormat("yyyy-MMM-dd")))
    fmt.Println("Go Time Format(NOW - 'HH:MM:SS'): ", GetToday(GoDateFormat.ConvertFormat("HH:MM:SS")))
    fmt.Println("Go Time Format(NOW - 'HH:MM:SS tt'): ", GetToday(GoDateFormat.ConvertFormat("HH:MM:SS tt")))
}

func GetToday(format string) (todayString string){
    today := time.Now()
    todayString = today.Format(format);
    return
}
Vignesh Kumar
quelle
1
strconv.Itoa(int(time.Now().Unix()))
feuyeux
quelle