Skip to content

time

time 패키지는 시간과 달력과 관련된 함수와 메서드를 제공합니다.

time.Now() 함수는 현재 시간을 가져올 수 있습니다.

go
func Now() Time
go
now := time.Now()
fmt.Println(now)
//2022-11-17 10:00:18.6983438 +0800 CST m=+0.007095001

반환되는 데이터 유형은 Time 구조체이며, 매우 많은 시간 조작 메서드를 포함하고 있습니다.

go
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 패키지에는 기본 시간 단위 상수가 있습니다.

go
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 가 탄생한 시간은 2006 년 1 월 2 일 오후 3 시 4 분입니다.

예시

go
now := time.Now()

24 시간 형식 출력

go
fmt.Println(now.Format("2006-01-02 15:04:05 Monday Jan"))
//2022-11-17 10:44:48 Thursday Nov

날짜만 출력

go
fmt.Println(now.Format("2006-01-02"))
//2022-11-17

12 시간제 시간만 출력

go
fmt.Println(now.Format("15:04:05 PM"))
//10:48:47 AM

시간 파싱

일반적으로 문자열 시간을 특정 형식으로 Go 의 시간 구조체로 변환해야 하는 요구사항이 있습니다. 이제 바로 그 작업을 수행하겠습니다.

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 CST

Timer

Timer 는 타이머로, channel 을 외부에 노출합니다. 지정된 시간이 되면 channel 이 메시지를 받고 닫힙니다.

go
func NewTimer(d Duration) *Timer

time.NewTimer() 를 통해 새 타이머를 생성할 수 있습니다.

go
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 는 정기적으로 트리거된다는 점입니다.

go
func NewTicker(d Duration) *Ticker

time.NewTicker() 를 통해 새 타이머를 생성할 수 있습니다.

go
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() 는 현재 goroutine 을 일정 시간 동안 대기 상태로 만듭니다. 이 기간 동안 goroutine 은 블로킹되며 실행 상태가 될 때까지 대기합니다.

go
func Sleep(d Duration)
go
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 출력 후 2 초간 블로킹된 다음 end 를 출력합니다.

Golang by www.golangdev.cn edit