Cảm ơn bạn đã liên hệ!

Chúng tôi đã nhận được thông tin của bạn và sẽ liên hệ lại với bạn trong thời gian sớm nhất.

Kết nối với chúng tôi

Đã sao chép link

Mục lục

Chia sẻ

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

11 THÁNG 11, 20215 phút đọc

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.

Rabiloo Co., Ltd.

Tầng 3, Tòa B1, Roman Plaza, đường Tố Hữu, Phường Hà Đông, Thành phố Hà Nội, Việt Nam

Rabiloo Japan Co., Ltd.

252-0216, Tầng 3, Tòa nhà Araki, 1-1-17 Seishin, Quận Chuo, Thành phố Sagamihara, Tỉnh Kanagawa, Nhật Bản

©2026 Rabiloo. All rights reserved.