
Go Time Truncate
อาทิตย์ที่ผ่านมาเจอกรณีว่าเขียนเทสที่ต่อกับ Firestore ซึ่งก็ใช้ Firestore Emulator แทนที่จะต่อไปที่ Firestore จริงๆ แต่กลับพบว่า Firestore Emulator เก็บ timestamp แค่ถึงหลัก microsecond แต่โค้ด Go เราส่งไปเก็บถึงหลัก nanosecond เลยทำให้ข้อมูล query กลับมาไม่เท่ากันกับที่ใส่เข้าไป
วิธีแก้ตอนนี้ที่รู้คือเราก็ทำให้ข้อมูลทดสอบเราตัดในส่วนของหลัก nanosecond ออกไปด้วยนั่นเอง ซึ่ง package time มี function ชื่อ time.Truncate
ให้เราเลือกได้ว่าจะตัดข้อมูลความละเอียดของเวลาถึงหลักไหนออกไป
เช่นถ้าในกรณีที่ผมเจอ ก็ให้เรียกฟังก์ชัน time.Time
แบบนี้
tm := time.Now()
tm = tm.Truncate(time.Microsecond)
จะเห็นว่าค่าที่เราต้องส่งให้ฟังก์ชันคือความละเอียดที่เราต้องการว่าจะให้มากที่สุดถึงหลักไหน เช่นผมใส่ time.Microsecond
ก็คือเอาถึงแค่หลักนี้ ถ้า tm
เราคือ 2022-11-22 23:59:59.999999999 +0000 UTC
เมื่อเรียก tm = tm.Truncate(time.Microsecond)
ก็จะได้ 2022-11-22 23:59:59.999999 +0000 UTC
ออกมาแทนนั่นเอง