เปลี่ยนจาก moment เป็น dayjs แทนเถอะ


จัดการเรื่องเวลาตอนเขียนโปรแกรมกันยังไงกันบ้าง เดิมทีแล้ว javascript ก็มีฟังก์ชันให้เรียกใช้ด้วยคำสั่ง new Date()
อยู่แล้วแต่ก็ไม่ค่อยได้ใช้
เพราะตอนใช้งานจริงเราใช้ library หรือ package ที่เป็นที่นิยมกันน่าจะดีกว่า รูปแบบคำสั่งหรือ syntax จะได้ดูเป็นมาตรฐานหน่อยใครมาอ่านก็เข้าใจได้เร็ว
ส่วนใหญ่จะใช้เพื่อจัด format YYYY-MM-DD และตั้ง timezone บ่อยมากๆ เพราะเวลาที่เก็บลงใน database เรามักจะเก็บเป็น UTC
แต่เวลานำไปใช้แสดงผลเราจะเปลี่ยนไปตาม timezone ของผู้ใช้เช่นของไทยก็จะ UTC +7
เนื้อหา
ปัญหาตอนใช้ momentjs
const moment = require("moment");
const momentNow = moment();console.log("momentNow: ", momentNow.format("YYYY-MM-DD HH:mm:ss"));const momentStartDate = momentNow.startOf("day");console.log("momentStartDate: ", momentStartDate.format("YYYY-MM-DD HH:mm:ss"));const momentEndDate = momentNow.endOf("day");console.log("momentEndDate: ", momentEndDate.format("YYYY-MM-DD HH:mm:ss"));
momentNow: 2022-11-14 21:07:54momentStartDate: 2022-11-14 00:00:00momentEndDate: 2022-11-14 23:59:59
จากที่เห็นมันก็ดูปกติดีไม่มีปัญหาอะไร ทีนี้มาลองอีกแบบลองย้าย console.log มาไว้ท้ายสุดให้หมดแล้วดูผลลัพธ์กัน
const moment = require("moment");
const momentNow = moment();const momentStartDate = momentNow.startOf("day");const momentEndDate = momentNow.endOf("day");console.log("momentNow: ", momentNow.format("YYYY-MM-DD HH:mm:ss"));console.log("momentStartDate: ", momentStartDate.format("YYYY-MM-DD HH:mm:ss"));console.log("momentEndDate: ", momentEndDate.format("YYYY-MM-DD HH:mm:ss"));
momentNow: 2022-11-14 23:59:59momentStartDate: 2022-11-14 23:59:59momentEndDate: 2022-11-14 23:59:59
สิ่งที่ได้ของ moment ก็ตามนี้เลย เวลามันเหมือนกันเฉยเลย สิ่งที่คาดหวังก็คือ
- momentNow ควรจะได้เวลา ณ ปัจจุบัน
- momentStartDate ควรจะเป็น วันปัจจุบันแล้วได้เวลาคือ 2022-11-14 00:00:00
- momentEndDate ถูกแล้ว ได้ตามที่ต้องการ
พอเห็นปัญหาแล้วใช่ไหม ลองคิดดูว่าถ้าเราเอาไปใช้ query ข้อมูลที่เป็นช่วงเวลาด้วยคำสั่ง sql BETWEEN ดู ได้ข้อมูลมาไม่ครบแน่ๆ
dayjs
ทีนี้ลองมาดู dayjs กันบ้าง เขียนเหมือนกันเลยแค่ไม่ใช่ moment เท่านั้นเอง
const dayjs = require("dayjs");
const dayjsNow = dayjs();const dayjsStartDate = dayjsNow.startOf("day");const dayjsEndDate = dayjsNow.endOf("day");console.log("dayjsNow: ", dayjsNow.format("YYYY-MM-DD HH:mm:ss"));console.log("dayjsStartDate: ", dayjsStartDate.format("YYYY-MM-DD HH:mm:ss"));console.log("dayjsEndDate: ", dayjsEndDate.format("YYYY-MM-DD HH:mm:ss"));
console.log("dayjsNow: ", dayjsNow.format("YYYY-MM-DD HH:mm:ss"));
dayjsNow: 2022-11-14 21:33:52dayjsStartDate: 2022-11-14 00:00:00dayjsEndDate: 2022-11-14 23:59:59dayjsNow: 2022-11-14 21:33:52
จากที่เห็นคือได้ตามที่ต้องการเลย
- dayjsNow ได้เวลา ณ ปัจจุบัน
- dayjsStartDate ได้เวลาเริ่มต้น ของวันปัจจุบัน
- dayjsEndDate ได้เวลาสุดท้าย ของวันปัจจุบัน
- dayjsNow ลองแสดงให้ดูอีกทีว่ามันดีกว่าจริงๆ
ขนาดของ package
dayjs มีขนาดเล็กกว่ามาก