Converter time.Time em string


103

Estou tentando adicionar alguns valores do meu banco de dados a um []stringno Go. Alguns deles são carimbos de data / hora.

Recebo o erro:

não pode usar U.Created_date (digite time.Time) como string de tipo no elemento da matriz

Posso converter time.Timepara 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

Eu adicionei o seguinte. Funciona agora, obrigado.

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

Vale ressaltar que o erro do compilador descreve o erro completamente. Você não pode colocar um tipo Time em uma matriz de strings.
Ben Campbell

Respostas:


160

Você pode usar o Time.String()método para converter a time.Timeem a string. Isso usa a string de formato "2006-01-02 15:04:05.999999999 -0700 MST".

Se precisar de outro formato personalizado, você pode usar Time.Format(). Por exemplo, para obter o carimbo de data / hora no formato, yyyy-MM-dd HH:mm:ssuse a string de formato "2006-01-02 15:04:05".

Exemplo:

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

Resultado (experimente no Go Playground ):

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

Nota: o tempo no Go Playground é sempre definido para o valor visto acima. Execute-o localmente para ver a data / hora atual.

Observe também que usando Time.Format(), como o layout, stringvocê sempre tem que passar o mesmo tempo –chamado de hora de referência– formatado da maneira que você deseja que o resultado seja formatado. Isso está documentado em Time.Format():

O formato retorna uma representação textual do valor do tempo formatado de acordo com o layout, que define o formato, mostrando como o tempo de referência, definido para ser

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

seria exibido se fosse o valor; serve como exemplo da saída desejada. As mesmas regras de exibição serão aplicadas ao valor da hora.


21
Só para deixar claro. Para passar um formato de hora personalizado, você deve usar o valor da hora Mon Jan 2 15:04:05 -0700 MST 2006e colocar essa hora no formato que desejar. Go entenderá o formato se você o passar com este valor. Você não pode usar nenhum outro valor de tempo. Levei algum tempo para descobrir isso e pensei em adicioná-lo como um comentário
Ahmed Essam

@AhmedEssam Obrigado, incluiu isso na resposta.
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
}    

1
Quando tento fmt.Println (. Time.Now () Format ( "2017/20/01 13:53:35")) Eu estou ficando estranho 21017/210/01 112: 3012: 1230
irom

3
use fmt.Println (time.Now (). Format ("2006/01/02 15:04:05")), porque a string de formato é fixa, é "2006 01 02 15 04 05"
Hao

2

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

Quando tento fmt.Println (. Time.Now () Format ( "2017/20/01 13:53:35")) Eu estou ficando estranho 21017/210/01 112: 3012: 1230
irom

porque você faz 20, o que não é significativo para go, então 2 é a data que provavelmente era 21 naquele momento e o 0 extra é apenas anexado @irom
nikoss

1

Encontre a solução simples para reunir o formato de data e hora em Go Lang. Por favor, encontre o exemplo abaixo.

Link do pacote: https://github.com/vigneshuvi/GoDateFormat .

Encontre os titulares de plackholders: 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
}

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.