Convertir tiempo, tiempo en cadena

103

Estoy tratando de agregar algunos valores de mi base de datos a un []stringin Go. Algunas de estas son marcas de tiempo.

Me sale el error:

no se puede usar U.Created_date (tipo time.Time) como tipo cadena en el elemento de matriz

¿Puedo convertirme time.Timea 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)
}

EDITAR

Agregué lo siguiente. Funciona ahora, gracias.

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")
ANUNCIO
fuente
Vale la pena destacar el hecho de que el error del compilador describe el error completamente. No se puede poner un tipo Time en una matriz de cadenas.
Ben Campbell

Respuestas:

160

Puede utilizar el Time.String()método para convertir un time.Timeen un string. Esto usa la cadena de formato "2006-01-02 15:04:05.999999999 -0700 MST".

Si necesita otro formato personalizado, puede usar Time.Format(). Por ejemplo, para obtener la marca de tiempo en el formato de yyyy-MM-dd HH:mm:ssuse la cadena de formato "2006-01-02 15:04:05".

Ejemplo:

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

Salida (pruébelo en Go Playground ):

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

Nota: el tiempo en Go Playground siempre se establece en el valor que se muestra arriba. Ejecútelo localmente para ver la fecha / hora actual.

También tenga en cuenta que al utilizar Time.Format(), como diseño string, siempre debe pasar el mismo tiempo, llamado tiempo de referencia , formateado de la manera que desee que se formatee el resultado. Esto está documentado en Time.Format():

El formato devuelve una representación textual del valor de tiempo formateado de acuerdo con el diseño, que define el formato mostrando cómo el tiempo de referencia, definido como

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

se mostraría si fuera el valor; sirve como ejemplo del resultado deseado. A continuación, se aplicarán las mismas reglas de visualización al valor de tiempo.

icza
fuente
21
Solo para aclarar. Para pasar un formato de hora personalizado, debe usar el valor de hora Mon Jan 2 15:04:05 -0700 MST 2006y poner esta hora en el formato que desee. Go comprenderá el formato si lo pasó con este valor. No puede utilizar ningún otro valor de tiempo. Me tomó un tiempo resolver esto y pensé en agregarlo como comentario
Ahmed Essam
@AhmedEssam Gracias, incluido eso en la respuesta.
icza
20
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
fuente
1
Cuando intento fmt.Println (time.Now (). Format ("2017/20/01 13:53:35")) me sale extraño 21017/210/01 112: 3012: 1230
irom
3
use fmt.Println (time.Now (). Format ("2006/01/02 15:04:05")), porque la cadena de formato es fija, es "2006 01 02 15 04 05"
Hao
2

Ir al patio de juegos 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
fuente
Cuando intento fmt.Println (time.Now (). Format ("2017/20/01 13:53:35")) me sale extraño 21017/210/01 112: 3012: 1230
irom
porque haces 20, lo cual no es significativo para ir, así que 2 es la fecha que probablemente era 21 en ese momento y el 0 adicional solo se agrega @irom
nikoss
1

Encuentre la solución simple para convertir el formato de fecha y hora en Go Lang. Encuentre el ejemplo a continuación.

Enlace del paquete: https://github.com/vigneshuvi/GoDateFormat .

Encuentre los plackholder: 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
fuente
1
strconv.Itoa(int(time.Now().Unix()))
feuyeux
fuente