Получить текущее время в виде форматированной строки в Go?

132

Как лучше всего получить текущую метку времени в Go и преобразовать ее в строку? Мне нужны дата и время, например. ГГГГММДДччммсс формат.

brianoh
источник
1
Это все, что вам нужно golangprograms.com/…
Эдуардо А. Фернандес Диас

Ответы:

149

Используйте time.Now()функцию и time.Format()метод.

t := time.Now()
fmt.Println(t.Format("20060102150405"))

распечатывает 20110504111515, или, по крайней мере, это было несколько минут назад. (Я использую восточное летнее время.) В константах, определенных в пакете времени, есть несколько предопределенных форматов времени.

Вы можете использовать, time.Now().UTC()если предпочитаете UTC, а не местный часовой пояс.

nmichaels
источник
15
Мне определенно нравится Kitchenконстанта ( = "3:04PM")
tux21b
5
Спасибо за эту информацию. Как пакет времени узнает, передавая «20060102150405», что именно мы передаем, поскольку это не одна из предопределенных констант в пакете времени? Какое значение имеют дата и время в пакете времени (20060102150405)? Мне это кажется немного странным, но пока он работает, я полагаю, это не имеет значения, если мы не делаем ошибки при кодировании. Я предполагаю, что они не сочли нужным предоставить константу для этого формата и соответствовать шаблону строки.
brianoh
9
@brianoh: См. golang.org/pkg/time/#Constants. Это время "01/02 15:04:05 PM '06 -0700", потому что каждый компонент имеет свой номер (1, 2, 3 и т. д.), он может определить по цифрам, какие компоненты вам нужны.
newacct
1
Обратите внимание, что time.LocalTime () больше не существует: см. Мой ответ ниже, чтобы быть совместимым с Go 1.0.3
Deleplace
71

Все остальные ответы очень неуместны для тех, кто пришел из Google и ищет «временную метку на ходу»! ГГГГММДДччммсс не является «отметкой времени».

Чтобы получить "отметку времени" даты на ходу (количество секунд с января 1970 г.), правильной функцией является .Unix () , и она действительно возвращает целое число.

Bactisme
источник
8
Я согласен; вопрос должен быть озаглавлен «текущая дата», а не «текущая временная метка»
разработчик
1
Хотя уже поздно, я думаю .Unix () должен указывать на golang.org/pkg/time/#Time.Unix , возвращаемый тип которого - int64.
bornfree
Хотя вы технически правы, я думаю, что многие программисты в наши дни объединяют метку времени с «текущим временем в некотором отформатированном виде», так что этот заголовок будет в равной степени запутанным для большинства.
Роджер Хилл
Я предложил отредактировать - Get current time as formatted string in Go?. Надеюсь, кто-нибудь это одобрит.
Акки
56

Для удобства чтения лучше всего использовать константы RFC во временном пакете (мне кажется)

import "fmt" 
import "time"

func main() {
    fmt.Println(time.Now().Format(time.RFC850))
}
matthewmcneely
источник
4
Как это дает YYYYMMDDhhmmss?
Род
2
RFC850 производит Tuesday, 10-Nov-09 23:00:00 UTC RFC3339 = "2006-01-02T15:04:05Z07:00" play.golang.org/p/XmobwWSz5pN golang.org/pkg/time
Крис Макки
33

Используйте функции time.Now () и time.Format () (поскольку time.LocalTime () больше не существует с Go 1.0.3)

t := time.Now()
fmt.Println(t.Format("20060102150405"))

Онлайн-демо (с датой, установленной в прошлом на игровой площадке, неважно)

Deleplace
источник
6
И вы можете использовать это просто как строку, например:s := "Actual time is: "+time.Now().String()
Майкл
2

Как отголосок ответа @Bactisme, способ получения текущей метки времени (например, в миллисекундах):

msec := time.Now().UnixNano() / 1000000

Ресурс: https://gobyexample.com/epoch

Джек Райан
источник
0

https://golang.org/src/time/format.go указано Для синтаксического анализа время 15используется для часов, 04используется для минут, 05для секунд.

Для разбора даты 11, Jan, Januaryэто в течение нескольких месяцев, 02, Mon, Mondayза день месяца, 2006за год и, конечно , MSTдля зоны

Но вы также можете использовать этот макет, который я считаю очень простым. "Mon Jan 2 15:04:05 MST 2006"

    const layout = "Mon Jan 2 15:04:05 MST 2006"
    userTimeString := "Fri Dec 6 13:05:05 CET 2019"

    t, _ := time.Parse(layout, userTimeString)
    fmt.Println("Server: ", t.Format(time.RFC850))
    //Server:  Friday, 06-Dec-19 13:05:05 CET

    mumbai, _ := time.LoadLocation("Asia/Kolkata")
    mumbaiTime := t.In(mumbai)
    fmt.Println("Mumbai: ", mumbaiTime.Format(time.RFC850))
    //Mumbai:  Friday, 06-Dec-19 18:35:05 IST

DEMO

СТАЛИ
источник
-4

Чтобы ответить на точный вопрос:

import "github.com/golang/protobuf/ptypes"

Timestamp, _ = ptypes.TimestampProto(time.Now())
Suran
источник
Спасибо, Суран, это полезно, когда необходимо отправить метку времени через grpc
rajeshk