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 เป็นตัวจับเวลา เปิดเผย channel ภายนอก เมื่อถึงเวลาที่กำหนด channel จะได้รับข้อความและปิด
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() สามารถทำให้ goroutine ปัจจุบันอยู่ในสถานะระงับเป็นระยะเวลาหนึ่ง ในช่วงเวลานี้ goroutine จะถูกบล็อกจนกว่าจะกลับสู่สถานะทำงาน
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
