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 ออกมาแทนนั่นเอง