time
O pacote time fornece funções e métodos relacionados a tempo e calendário.
A função time.Now() pode obter a hora atual:
func Now() Timenow := time.Now()
fmt.Println(now)
//2022-11-17 10:00:18.6983438 +0800 CST m=+0.007095001O tipo de dado retornado é a struct Time, que contém muitos métodos de operação de tempo:
func (t *Time) nsec() int32 // Nanossegundos
func (t *Time) sec() int64 // Segundos
func (t *Time) unixSec() // Retorna segundos no formato de tempo Unix
func (t *Time) addSec(d int64) // Adiciona segundos
func (t *Time) setLoc(loc *Location) // Define região
func (t *Time) stripMono() // Remove leitura de relógio monotônico do tempo
func (t Time) After(u Time) // Verifica se um tempo está depois de outro
func (t Time) Before(u Time) bool // Verifica se um tempo está antes de outro
func (t Time) Equal(u Time) bool // Verifica se dois tempos representam o mesmo instante
func (t Time) Sub(u Time) Duration // Calcula a diferença entre dois tempos
func (t Time) Add(d Duration) Time // Adiciona um intervalo de tempoUnidades de Tempo
O pacote time armazena constantes de unidades de tempo básicas:
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
)O tipo delas é time.Duration, a menor unidade é nanossegundo e a maior é hora.
Formatação
O tipo de tempo pode ser formatado para saída. É importante notar que o modelo de formatação em Go não é o comum yyyy-mm-dd, mas sim baseado no tempo de nascimento do Go. O Go nasceu em 2 de janeiro de 2006 às 15:04.
Exemplo:
now := time.Now()Formatação de saída em 24 horas:
fmt.Println(now.Format("2006-01-02 15:04:05 Monday Jan"))
//2022-11-17 10:44:48 Thursday NovApenas saída da data:
fmt.Println(now.Format("2006-01-02"))
//2022-11-17Apenas saída de hora no formato 12 horas:
fmt.Println(now.Format("15:04:05 PM"))
//10:48:47 AMAnálise de Tempo
Normalmente temos uma necessidade de converter uma string de tempo em uma struct de tempo do Go de acordo com um formato específico. É isso que faremos a seguir:
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())
}Saída final:
2012-10-12 00:00:00 +0800 CSTTimer
Timer é um cronômetro que expõe um channel. Quando o tempo especificado chega, o channel receberá uma mensagem e será fechado:
func NewTimer(d Duration) *TimerPode-se criar um novo cronômetro através de 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.007908001Após usar o timer, deve-se fechá-lo oportunamente.
Ticker
Ticker é um temporizador. A diferença em relação ao timer é que o timer é único, enquanto o Ticker é acionado periodicamente:
func NewTicker(d Duration) *TickerPode-se criar um novo temporizador através de 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.016742001Da mesma forma, após usar o ticker, deve-se fechá-lo oportunamente.
Sleep
time.Sleep() pode fazer a goroutine atual ficar suspensa por um determinado período de tempo. Durante este período, a goroutine será bloqueada até retomar o estado de execução:
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.013496401Este programa será bloqueado por dois segundos após imprimir start e depois imprimirá end.
