time
Пакет time предоставляет функции и методы для работы со временем и календарём.
Функция time.Now() получает текущее время:
func Now() Timenow := time.Now()
fmt.Println(now)
//2022-11-17 10:00:18.6983438 +0800 CST m=+0.007095001Возвращаемый тип данных — структура Time, содержащая множество методов для работы со временем:
func (t *Time) nsec() int32 // наносекунды
func (t *Time) sec() int64 // секунды
func (t *Time) unixSec() // возвращает время в формате Unix (секунды)
func (t *Time) addSec(d int64) // добавление секунд
func (t *Time) setLoc(loc *Location) // установка региона
func (t *Time) stripMono() // удаление монотонных показаний часов
func (t Time) After(u Time) // проверка, находится ли одно время после другого
func (t Time) Before(u Time) bool // проверка, находится ли одно время до другого
func (t Time) Equal(u Time) bool // проверка, представляют ли два времени один момент
func (t Time) Sub(u Time) Duration // вычисление разницы между двумя временами
func (t Time) Add(d Duration) Time // добавление временного интервалаЕдиницы времени
Пакет time содержит базовые константы единиц времени:
const (
minDuration Duration = -1 << 63
maxDuration Duration = 1<<63 - 1
)
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)Их тип — time.Duration, минимальная единица — наносекунда, максимальная — час.
Форматирование
Время можно форматировать. Следует отметить, что в Go шаблон форматирования не является привычным yyyy-mm-dd, а основан на времени рождения Go. Go родился 2 января 2006 года в 15:04.
Пример:
now := time.Now()Форматирование 24-часового времени:
fmt.Println(now.Format("2006-01-02 15:04:05 Monday Jan"))
//2022-11-17 10:44:48 Thursday NovТолько дата:
fmt.Println(now.Format("2006-01-02"))
//2022-11-17Только время в 12-часовом формате:
fmt.Println(now.Format("15:04:05 PM"))
//10:48:47 AMРазбор времени
Часто возникает задача преобразовать строку времени в структуру времени Go согласно определённому формату. Вот как это делается:
func main() {
location, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Println(err)
return
}
inLocation, err := time.ParseInLocation("2006/01/02", "2012/10/12", location)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(inLocation.String())
}Вывод:
2012-10-12 00:00:00 +0800 CSTTimer
Timer — это таймер, предоставляющий канал. Когда указанное время истекает, канал получает сообщение и закрывается.
func NewTimer(d Duration) *TimerСоздание нового таймера через time.NewTimer():
func main() {
timer := time.NewTimer(time.Second)
defer timer.Stop()
select {
case t := <-timer.C:
fmt.Println(t)
}
}2023-09-25 21:25:03.5696803 +0800 CST m=+1.007908001После использования timer следует своевременно закрывать.
Ticker
Ticker — это таймер, отличающийся от timer тем, что timer одноразовый, а Ticker срабатывает периодически.
func NewTicker(d Duration) *TickerСоздание нового таймера через time.NewTicker():
func main() {
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for i := 0; i < 3; i++ {
select {
case t := <-ticker.C:
fmt.Println(t)
}
}
}2023-09-25 21:29:20.4429256 +0800 CST m=+1.009508401
2023-09-25 21:29:21.4512075 +0800 CST m=+2.017790301
2023-09-25 21:29:22.4501592 +0800 CST m=+3.016742001Также после использования ticker следует своевременно закрывать.
sleep
time.Sleep() переводит текущую горутину в состояние ожидания на определённое время. В этот период горутина блокируется до восстановления рабочего состояния.
func Sleep(d Duration)func main() {
start := time.Now()
fmt.Println(start)
time.Sleep(time.Second * 2)
end := time.Now()
fmt.Println(end)
}2023-09-25 21:36:35.7229057 +0800 CST m=+0.001627901
2023-09-25 21:36:37.7347742 +0800 CST m=+2.013496401Эта программа после вывода start блокируется на две секунды, затем выводит end.
