Share

Quay lại
Trang chủ / Kiến thức / Phát triển offshore / Gặp lỗi về Daylight Saving Time (DST) khi lập trình? Đọc ngay bài viết này!

Gặp lỗi về Daylight Saving Time (DST) khi lập trình? Đọc ngay bài viết này!

15/12/2023
11/11/2021
Gặp lỗi về Daylight Saving Time (DST) khi lập trình? Đọc ngay bài viết này!

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é.

1. DST là gì 

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

 

2.  Một số vấn đề gặp phải liên quan đến DST trong lập trình

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:

  • Lần 1 - Vặn đồng hồ sớm lên 1 tiếng: Vào ngày 06/05/1951 (chủ nhật đầu tiên của tháng 5) Nhật Bản đã vặn đồng hồ nhanh lên 1 tiếng từ 00:00:00 lên 01:00:00.
  • Lần 2 - Vặn đồng hồ chậm lại một tiếng: Vào ngày 08/09/1951 Nhật Bản tiến hành vặn đồng hồ chậm lại 1 tiếng để thời gian quay về như cũ (02:00:00 xuống còn 01:00:00). 

Những lần thay đổi thời gian đã tạo ra 2 điều cần lưu ý sau:

  • Khoảng thời gian từ 00:00:00 đến 01:00:00 của ngày 06/05/1951 không tồn tại.
  • Khoảng thời gian 01:00:00 đến 02:00:00 của ngày 08/09/1951 lại được lặp lại 2 lần.

Đ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 đề 1: Không lấy được dữ liệu từ database

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.

Vấn đề 2: Convert dữ liệu bị sai 

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

3. Cách xử lý vấn đề liên quan đến DST

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:

  • Sử dụng java.time thay vì sử dụng data thông thường 
  • Ở trong database với những trường như birthday dùng kiểu DATETIME thay vì chỉ dùng kiểu DATE.
  • Sử dụng thêm Annotation @Temporal (TemporalType.DATE)
  • Quan trọng nhất, cần xác định trong hệ thống chúng ta những logic liên quan đến thời gian nào có thể gây ra lỗi liên quan đến DST. Từ đó đưa ra phương pháp xử lý thích hợp.

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 

Kết luận 

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


Cập nhật bài viết mới nhất từ chuyên gia

Không được để trống
Không được để trống
Không được để trống
Không được để trống
Tìm kiếm
Tags
Website là gì? Khái niệm, cấu tạo, phân loại các Website hiện nay
24/11/2023
21/12/2023
Website là gì? Khái niệm, cấu tạo, phân loại các Website hiện nay

Gặp gỡ và lắng nghe

Không được để trống
Không được để trống
Không được để trống
Không được để trống