Share
Khi lập trình chắc hẳn ai trong chúng ta cũng từng làm việc với thời gian, Time zone. Liên quan đến vấn đề thời gian có một khái niệm khá hay là DayLight Saving Time (DST). Chúng ta cùng tìm hiểu nhé.
DST là quy ước chỉnh đồng hồ tăng thêm một khoảng thời gian (thường là 1 giờ) so với giờ tiêu chuẩn, vào mùa hè, và vặn chậm lại đồng hồ (cũng thường là một giờ) vào mùa đông. Điều này rất phổ biến ở nhiều quốc gia.
Quy ước này thường được thực hiện tại các nước ôn đới hay gần cực, nơi mà vào mùa hè, ban ngày bắt đầu sớm hơn so với mùa đông vài tiếng đồng hồ. Nó có ý nghĩa thực tiễn là giúp tiết kiệm năng lượng chiếu sáng và sưởi ấm, khi tận dụng ánh sáng ngày của ngày làm việc từ sớm, giảm chiếu sáng ban đêm nhờ ngủ sớm.
Minh hoạ DayLight Saving Time
Trong các ví dụ dưới đây mình sẽ lấy time zone của Nhật Bản GMT +9. Ngôn ngữ lập trình Java.
Nhật Bản là một đất nước ôn đới, trong quá khứ đã có nhiều lần áp dụng DST. Ví dụ vào năm 1951. Bạn có thể xem thêm ở đây.
Nhật Bản thực hiện hoạt động Daylight Saving Time như sau:
Những lần thay đổi thời gian đã tạo ra 2 điều cần lưu ý sau:
Điều này đối với cuộc sống thường nhật thì không có ảnh hưởng, nhưng với các hệ thống máy móc và đặc biệt trong lập trình. Sau đây là các vấn đề cụ thể.
Vấn đề này được chúng tôi mô tả thông qua từng bước thực hiện. Nhưng tóm lại, việc lấy dữ liệu sẽ gặp lỗi vì có một mốc thời gian bị khuyết.
Bước 1: Tạo Entity như bên dưới
Cấu trúc entity
Bước 2: Tạo 1 API get dữ liệu của entity vừa tạo
API get dữ liệu
Bước 3: Tạo data mẫu
Dữ liệu test (có chứa ngày 06/05/1951)
Sau khi get dữ liệu từ API ở bước 2 ta sẽ gặp lỗi này:
Do ngày 05/06/1951 không tồn tại mốc thời gian 00:00:00 nên lúc lấy dữ liệu ra bị lỗi.
Khi thực hiện convert dữ liệu data, chúng ta nhận thấy nếu dùng Date bình thường thì thời gian bị sai, còn dùng LocalDateTime (có từ Java 8) thì không gặp vấn đề này.
Thời gian bị tăng lên 1 tiếng
Việc gặp phải những vấn đề có liên quan đến DST khá hiếm, vì lỗi chỉ xảy ra vào 1 ngày cụ thể trong một time zone cụ thể. Tuy nhiên nhà phát triển phần mềm và khách hàng cần biết để tránh gặp lỗi.
Để giải quyết 2 vấn đề nói trên, nhóm kỹ sư phần mềm của Rabiloo đã áp dụng 4 giải pháp như sau:
Ngoài Java, các ngôn ngữ khác cũng cung cấp cho chúng ta các thư viện để tránh vấn đề này. Ví dụ, trong .Net sử dụng Noda Time, trong Python sử dụng datautil…
Bạn có thể tham khảo thêm ở đây
Qua bài viết này chúng tôi đã giới thiệu tới các bạn về Daylight saving time (DST), một số lỗi liên quan đến DST và cách khắc phục. Hãy sử dụng bài viết này một cách hiệu quả. Hẹn gặp lại ở các bài viết tiếp theo.
Nếu bạn đang cần tư vấn về bất kỳ điều gì về lĩnh vực công nghệ, dù chỉ là điều nhỏ nhất, đừng ngại liên hệ với đội ngũ tư vấn của Rabiloo. Chúng tôi ở đây để lắng nghe và chia sẻ cùng bạn.
Share