Hướng dẫn timezone options python - trăn tùy chọn múi giờ

Múi giờ (timezone) là gì?

Múi giờ của bạn là bao nhiêu? Nếu câu trả lời là “UTC+X” thì có thể là nó đúng trong thời điểm hiện tại, chứ không hắn là lúc nào cũng vậy. Ví dụ dữ liệu múi giờ của “Asia/Ho_Chi_Minh”:

Nội dung chính

  • Múi giờ (timezone) là gì?
  • Vậy ta lấy gì làm mốc?
  • Còn vấn đề nào khác?
  • Best practices
  • Convert timezone
  • Sử dụng UTC trong tính toán nội bộ
  • Không nên dùng offset-aware datetime

# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
Zone Asia/Ho_Chi_Minh	7:06:40 -	LMT	1906 Jul  1
			7:06:30	-	PLMT	1911 May  1 # Phù Liễn MT
			7:00	-	+07	1942 Dec 31 23:00
			8:00	-	+08	1945 Mar 14 23:00
			9:00	-	+09	1945 Sep  2
			7:00	-	+07	1947 Apr  1
			8:00	-	+08	1955 Jul  1
			7:00	-	+07	1959 Dec 31 23:00
			8:00	-	+08	1975 Jun 13
			7:00	-	+07

Bạn có thể thấy giá trị của X (GMTOFF) thay đổi qua từng thời kì, và hiện tại là +7.

Ngoài ra trên thế giới ở một số quốc gia còn áp dụng quy ước giờ mùa hè (Daylight Saving Time - DST), nó 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 trong một giai đoạn (thường là vào mùa hè) trong năm. 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 ban 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.

Cũng chính vì thế mà DST gây ra những vấn đề lớn trong tính toán.

Vậy ta lấy gì làm mốc?

Còn vấn đề nào khác?

Best practices

Còn vấn đề nào khác?

Best practices

  1. Convert timezone
  2. Sử dụng UTC trong tính toán nội bộ
  3. Không nên dùng offset-aware datetime

Bạn có thể thấy giá trị của X (GMTOFF) thay đổi qua từng thời kì, và hiện tại là +7.

>>> dt1 = datetime.utcnow()
>>> dt2 = dt1.replace(tzinfo=pytz.utc)
>>> dt1 > dt2
Traceback (most recent call last):
  File "", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes

Ngoài ra trên thế giới ở một số quốc gia còn áp dụng quy ước giờ mùa hè (Daylight Saving Time - DST), nó 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 trong một giai đoạn (thường là vào mùa hè) trong năm. 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 ban 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.

dt1 = datetime.utcnow()

dt2 = datetime.now()

Cũng chính vì thế mà DST gây ra những vấn đề lớn trong tính toán.

Múi giờ lấy làm mốc bây giờ là UTC. UTC là múi giờ không có DST hay những thay đổi trong quá khứ. Từ UTC bạn có thể chuyển đổi giờ sang giờ địa phương, nhưng ngược lại chưa chắc đã đúng vì lý do đã nêu ở trên.

Best practices

Convert timezone

Sử dụng UTC trong tính toán nội bộ

Không nên dùng offset-aware datetime

Bạn có thể thấy giá trị của X (GMTOFF) thay đổi qua từng thời kì, và hiện tại là +7.

Sử dụng UTC trong tính toán nội bộ

Không nên dùng offset-aware datetime

Không nên dùng offset-aware datetime

Bạn có thể thấy giá trị của X (GMTOFF) thay đổi qua từng thời kì, và hiện tại là +7.

Ngoài ra trên thế giới ở một số quốc gia còn áp dụng quy ước giờ mùa hè (Daylight Saving Time - DST), nó 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 trong một giai đoạn (thường là vào mùa hè) trong năm. 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 ban 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.

  • Cũng chính vì thế mà DST gây ra những vấn đề lớn trong tính toán.
  • Múi giờ lấy làm mốc bây giờ là UTC. UTC là múi giờ không có DST hay những thay đổi trong quá khứ. Từ UTC bạn có thể chuyển đổi giờ sang giờ địa phương, nhưng ngược lại chưa chắc đã đúng vì lý do đã nêu ở trên.

Luôn luôn tính toán và lưu dữ liệu ở múi giờ UTC. Nếu bạn cần lưu múi giờ tại thời điểm diễn ra, lưu nó riêng biệt. Không bao giờ lưu dữ liệu là “giờ địa phương + múi giờ”.

Tuy nhiên trong thư viện chuẩn của Python lại có sai sót trong thiết kế: