Перетворити час. Час у рядок


103

Я намагаюся додати деякі значення зі своєї бази даних у файл []stringGo. Деякі з них є позначками часу.

Я отримую помилку:

не може використовувати U.Created_date (тип time.Time) як рядок типу в елементі масиву

Чи можу я перетворити time.Timeна 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)
}

EDIT

Я додав наступне. Зараз це працює, дякую.

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

Варто підкреслити той факт, що помилка компілятора повністю описує помилку. Ви не можете помістити тип Time у масив рядків.
Бен Кемпбелл,

Відповіді:


160

За допомогою Time.String()методу можна перетворити a time.Timeна a string. Тут використовується рядок формату "2006-01-02 15:04:05.999999999 -0700 MST".

Якщо вам потрібен інший спеціальний формат, ви можете використовувати Time.Format(). Наприклад, щоб отримати позначку часу у форматі, yyyy-MM-dd HH:mm:ssвикористовуйте рядок формату "2006-01-02 15:04:05".

Приклад:

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

Результат (спробуйте на Go Playground ):

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

Примітка: час на майданчику Go Play завжди встановлюється на значення, яке видно вище. Запустіть його локально, щоб побачити поточну дату / час.

Також зауважте, що використовуючи Time.Format()як макет, stringви завжди повинні проходити один і той же час - називається контрольний час - відформатований так, як ви хочете, щоб результат був відформатований. Це задокументовано за адресою Time.Format():

Формат повертає текстове подання значення часу, відформатованого відповідно до макета, який визначає формат, показуючи, як контрольний час, визначений як

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

відображатиметься, якби це було значення; це служить прикладом бажаного результату. Потім ті самі правила відображення застосовуватимуться до значення часу.


21
Тільки для пояснення. Для того, щоб передати власний формат часу, вам потрібно використати значення часу Mon Jan 2 15:04:05 -0700 MST 2006і встановити цей час у будь-якому форматі, який ви хочете. Go зрозуміє формат, якщо ви передали його з цим значенням. Ви не можете використовувати будь-яке інше значення часу. Мені знадобився час, щоб це зрозуміти і подумав додати це як коментар
Ахмед Ессам,

@AhmedEssam Дякую, включив це у відповідь.
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
Коли я намагаюся fmt.Println (time.Now (). Format ("2017/20/01 13:53:35"), я отримую дивні 21017/210/01 112: 3012: 1230
irom

3
використовуйте fmt.Println (time.Now (). Format ("02.01.2006 15:04:05")), оскільки рядок формату фіксований, це "2006 01 02 15 04 05"
Хао,

2

Перейдіть на ігровий майданчик 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)
}

Коли я намагаюся fmt.Println (time.Now (). Format ("2017/20/01 13:53:35"), я отримую дивні 21017/210/01 112: 3012: 1230
irom

тому що ви робите 20, що не має сенсу для go, тому 2 - це дата, яка, мабуть, на той момент була 21, а зайвий 0 просто додається @irom
nikoss

1

Будь ласка, знайдіть просте рішення для створення формату дати та часу в Go Lang. Будь ласка, знайдіть приклад нижче.

Посилання на пакет: https://github.com/vigneshuvi/GoDateFormat .

Будь ласка, знайдіть власників стикерів: 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
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.