Konwertuj czas, czas na ciąg

105

Próbuję dodać niektóre wartości z mojej bazy danych do []stringin Go. Niektóre z nich to sygnatury czasowe.

Wyskakuje mi błąd:

nie można użyć U.Created_date (typ time.Time) jako ciągu typu w elemencie tablicy

Czy mogę zamienić time.Timena 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)
}

EDYTOWAĆ

Dodałem co następuje. Teraz działa, dzięki.

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")
OGŁOSZENIE
źródło
Warto podkreślić, że błąd kompilatora całkowicie opisuje błąd. Nie można umieścić typu Time w tablicy ciągów.
Ben Campbell
Możliwe powtórzenie Jak sformatować aktualną godzinę w formacie rrrrMMddGGmmss?
Oleksandr Savchenko

Odpowiedzi:

162

Możesz użyć tej Time.String()metody, aby przekonwertować plik time.Timea na string. Używa ciągu formatu "2006-01-02 15:04:05.999999999 -0700 MST".

Jeśli potrzebujesz innego formatu niestandardowego, możesz użyć Time.Format(). Na przykład, aby uzyskać znacznik czasu w formacie, yyyy-MM-dd HH:mm:ssużyj ciągu formatu "2006-01-02 15:04:05".

Przykład:

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

Wyjście (wypróbuj na Go Playground ):

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

Uwaga: czas na Go Playground jest zawsze ustawiony na wartość pokazaną powyżej. Uruchom go lokalnie, aby zobaczyć aktualną datę / godzinę.

Zauważ również, że używając Time.Format(), jako układu string, zawsze musisz przejść ten sam czas - nazywany czasem odniesienia - sformatowany w taki sposób, w jaki chcesz, aby wynik był sformatowany. Jest to udokumentowane pod adresem Time.Format():

Format zwraca tekstową reprezentację wartości czasu sformatowaną zgodnie z układem, która definiuje format, pokazując, jak czas odniesienia zdefiniowano jako

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

byłaby wyświetlana, gdyby była wartością; służy jako przykład pożądanego wyniku. Te same reguły wyświetlania zostaną następnie zastosowane do wartości czasu.

icza
źródło
21
Żeby było jasne. Aby przekazać niestandardowy format czasu, musisz użyć wartości czasu Mon Jan 2 15:04:05 -0700 MST 2006i ustawić ten czas w dowolnym formacie. Go zrozumie format, jeśli przekazałeś go z tą wartością. Nie możesz użyć żadnej innej wartości czasu. Zajęło mi trochę czasu, aby to rozgryźć i pomyślałem, że dodaję to jako komentarz
Ahmed Essam,
@AhmedEssam Dzięki, zawarłem to w odpowiedzi.
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
źródło
1
Kiedy próbuję fmt.Println (time.Now (). Format ("2017/20/01 13:53:35")) Obraz jest dziwny 21017/210/01 112: 3012: 1230
irom
3
użyj fmt.Println (time.Now (). Format ("2006/01/02 15:04:05")), ponieważ ciąg formatu jest ustalony, to "2006 01 02 15 04 05"
Hao
2

Idź do 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)
}
firebitsbr
źródło
Kiedy próbuję fmt.Println (time.Now (). Format ("2017/20/01 13:53:35")) Obraz jest dziwny 21017/210/01 112: 3012: 1230
irom
ponieważ robisz 20, co nie ma znaczenia dla go, więc 2 to data, która prawdopodobnie w tym czasie wynosiła 21, a dodatkowe 0 jest właśnie dodane @irom
nikoss
1

Znajdź proste rozwiązanie, aby przekonwertować format daty i czasu w Go Lang. Poniżej znajduje się przykład.

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

Proszę znaleźć posiadaczy placków: 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
źródło
1
strconv.Itoa(int(time.Now().Unix()))
feuyeux
źródło