Python datetime utc offset

Xin lưu ý. Phần đầu tiên của câu trả lời này là hoặc phiên bản 1. x của con lắc. Xem bên dưới để biết phiên bản 2. câu trả lời x

Nội dung chính Hiển thị

  • tổng quan
  • Mẹo 1. Khoảng thời gian sử dụng chuẩn hóa
  • Mẹo 2. Chuyển đổi Chuỗi thành Ngày giờ
  • Mẹo 3. Chuyển kiểu Datetime sang Timestamp Python
  • Mẹo 4. Chuyển kiểu ngày gốc sang múi giờ UTC
  • Mẹo 5. Chuyển đổi UTC sang múi giờ khác
  • Mẹo 6. Chuyên từ Dấu thời gian sang Datetime
  • Mẹo 7. Chuyển đổi Datetime sang ISO 8601
  • Múi giờ [múi giờ] là gì?
  • Vì vậy ta lấy gì làm việc?
  • Còn vấn đề nào khác?
  • Thực hành tốt nhất
  • Chuyển đổi múi giờ
  • Sử dụng UTC trong tính toán nội bộ
  • Không nên sử dụng ngày giờ nhận biết offset

Tôi hy vọng tôi không quá muộn

Thư viện con lắc vượt trội về điều này và các tính toán ngày giờ khác

>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.datetime.strptime[heres_a_time, '%Y-%m-%d %H:%M %z']
>>> for tz in some_time_zones:
..     tz, pendulum_time.astimezone[tz]
..     
['Europe/Paris', ]
['Europe/Moscow', ]
['America/Toronto', ]
['UTC', ]
['Canada/Pacific', ]
['Asia/Macao', ]

Câu trả lời liệt kê tên của các múi giờ có thể được sử dụng với con lắc. [Chúng giống như đối với pytz. ]

Đối với phiên bản 2

  • >>> import pendulum
    >>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
    >>> heres_a_time = '1996-03-25 12:03 -0400'
    >>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
    >>> for tz in some_time_zones:
    ..     tz, pendulum_time.in_tz[tz]
    ..     
    ['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
    ['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
    ['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
    ['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
    ['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
    ['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]
    
    3 là danh sách tên của các múi giờ có thể được sử dụng trong một chương trình
  • >>> import pendulum
    >>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
    >>> heres_a_time = '1996-03-25 12:03 -0400'
    >>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
    >>> for tz in some_time_zones:
    ..     tz, pendulum_time.in_tz[tz]
    ..     
    ['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
    ['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
    ['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
    ['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
    ['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
    ['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]
    
    4 là thời gian mẫu, hoàn chỉnh với múi giờ ở dạng '-0400'
  • Tôi bắt đầu bằng cách chuyển đổi thời gian thành thời gian con lắc để xử lý tiếp theo
  • bây giờ tôi có thể hiển thị thời gian này ở mỗi múi giờ trong
    >>> import pendulum
    >>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
    >>> heres_a_time = '1996-03-25 12:03 -0400'
    >>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
    >>> for tz in some_time_zones:
    ..     tz, pendulum_time.in_tz[tz]
    ..     
    ['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
    ['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
    ['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
    ['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
    ['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
    ['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]
    
    5

...

>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
>>> for tz in some_time_zones:
..     tz, pendulum_time.in_tz[tz]
..     
['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]

tổng quan

Gần đây mình đang làm nhiều việc với kiểu dữ liệu Datetime trong Python. Vấn đề mình gặp phải là xử lý nhiều loại định dạng thời gian khác nhau, chuyển hóa thành định dạng Ngày giờ, chuẩn hóa thời gian lưu trữ và lưu vào cơ sở dữ liệu. Và sau đây, mình sẽ viết bài chia sẻ về cách mình xử lý kiểu dữ liệu Datetime trong Python. Trong bài mình sẽ sử dụng Python 3 để xử lý kiểu dữ liệu Datetime

Nội dung chính

  • tổng quan
  • Mẹo 1. Khoảng thời gian sử dụng chuẩn hóa
  • Mẹo 2. Chuyển đổi Chuỗi thành Ngày giờ
  • Mẹo 3. Chuyển kiểu Datetime sang Timestamp Python
  • Mẹo 4. Chuyển kiểu ngày gốc sang múi giờ UTC
  • Mẹo 5. Chuyển đổi UTC sang múi giờ khác
  • Mẹo 6. Chuyên từ Dấu thời gian sang Datetime
  • Mẹo 7. Chuyển đổi Datetime sang ISO 8601
  • Múi giờ [múi giờ] là gì?
  • Vì vậy ta lấy gì làm việc?
  • Còn vấn đề nào khác?
  • Thực hành tốt nhất
  • Chuyển đổi múi giờ
  • Sử dụng UTC trong tính toán nội bộ
  • Không nên sử dụng ngày giờ nhận biết offset

Mẹo 1. Khoảng thời gian sử dụng chuẩn hóa

Đầu tiên, cũng là quan trọng nhất, tiêu chuẩn hóa múi giờ sử dụng để chuyển đổi các kiểu thời gian. Mình lựa chọn sử dụng múi giờ chuẩn UTC để chuẩn hóa thời gian cho cả hệ thống cũng như làm múi giờ chuẩn để xử lý các loại định dạng thời gian khác nhau

Tham khảo thêm về thời gian UTC tại

Mẹo 2. Chuyển đổi Chuỗi thành Ngày giờ

Xử lý bằng hàm

>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
>>> for tz in some_time_zones:
..     tz, pendulum_time.in_tz[tz]
..     
['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]
6

import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-20T03:41:16Z'

# Dạng datetime format
date_time_python = parse[date_string]

Xử lý bằng strptime

import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-21 03:41:16'

# Strptime
format = '%Y-%m-%d %H:%M:%S'
date_time_python = datetime.datetime.strptime[date_string, format]

Lưu ý

  • Rất nhiều định dạng thời gian khác nhau nên để có thể chuyển từ chuỗi thành Datetime
    >>> import pendulum
    >>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
    >>> heres_a_time = '1996-03-25 12:03 -0400'
    >>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
    >>> for tz in some_time_zones:
    ..     tz, pendulum_time.in_tz[tz]
    ..     
    ['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
    ['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
    ['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
    ['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
    ['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
    ['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]
    
    6 chỉ có thể xử lý một số định dạng tiêu chuẩn, nếu định dạng tiêu chuẩn khác phải hiểu cấu trúc chuỗi thời gian để sử dụng hàm
    >>> import pendulum
    >>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
    >>> heres_a_time = '1996-03-25 12:03 -0400'
    >>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
    >>> for tz in some_time_zones:
    ..     tz, pendulum_time.in_tz[tz]
    ..     
    ['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
    ['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
    ['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
    ['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
    ['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
    ['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]
    
    8 để cắt chuỗi tạo Datetime
  • Nếu kiểu dữ liệu Datetime không xác định được múi giờ thì được gọi là
    >>> import pendulum
    >>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
    >>> heres_a_time = '1996-03-25 12:03 -0400'
    >>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
    >>> for tz in some_time_zones:
    ..     tz, pendulum_time.in_tz[tz]
    ..     
    ['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
    ['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
    ['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
    ['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
    ['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
    ['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]
    
    9

Mẹo 3. Chuyển kiểu Datetime sang Timestamp Python

Dấu thời gian là kiểu thời gian thông tin ứng dụng của hệ thống thông tin Unix, tìm hiểu thêm tại

>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
>>> for tz in some_time_zones:
..     tz, pendulum_time.in_tz[tz]
..     
['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]
1

Mẹo 4. Chuyển kiểu ngày gốc sang múi giờ UTC

Kiểm tra loại múi giờ

>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
>>> for tz in some_time_zones:
..     tz, pendulum_time.in_tz[tz]
..     
['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]
2

Lưu ý. không sử dụng hàm thay thế, hàm thay thế sẽ chỉ thay đổi tzinfo không quy định thời gian từ múi giờ này sang múi giờ khác

Mẹo 5. Chuyển đổi UTC sang múi giờ khác

Nếu bạn đang ở múi giờ Việt Nam [GMT+7], tức nếu hiện tại là 8 giờ sáng [giờ Việt Nam] thì quy ra giờ UTC tức 1 giờ sáng [giờ UTC]. Vì vậy nếu Datetime đang ở múi giờ UTC thì ta phải convert nó sáng giờ Việt Nam

>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
>>> for tz in some_time_zones:
..     tz, pendulum_time.in_tz[tz]
..     
['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]
3

Mẹo 6. Chuyên từ Dấu thời gian sang Datetime

>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
>>> for tz in some_time_zones:
..     tz, pendulum_time.in_tz[tz]
..     
['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]
4

Mẹo 7. Chuyển đổi Datetime sang ISO 8601

ISO 8601 là một tiêu chuẩn quốc tế, được đưa ra bởi Tổ chức tiêu chuẩn hóa quốc tế [ISO] lần đầu tiên vào năm 1988, mô tả quy cách viết ngày tháng và thời gian theo cách đơn giản nhất mà máy tính có thể hiểu được. . Còn đối với Python ISO 8601 Datetime is string format time information information

>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
>>> for tz in some_time_zones:
..     tz, pendulum_time.in_tz[tz]
..     
['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]
5

Nguồn

https. //vi. wikipedia. org/wiki/Th%E1%BA%A3o_lu%E1%BA%ADn. M%C3%BAi_gi%E1%BB%9D

https. //vi. wikipedia. org/wiki/Th%E1%BA%A3o_lu%E1%BA%ADn. M%C3%BAi_gi%E1%BB%9D

Thực hiện bởi cloud365. vn

Múi giờ [múi giờ] là gì?

Giờ của bạn là bao nhiêu? . Ví dụ về múi giờ dữ liệu của “Asia/Ho_Chi_Minh”

>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
>>> for tz in some_time_zones:
..     tz, pendulum_time.in_tz[tz]
..     
['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]
6

Bạn có thể thấy giá trị của X [GMTOFF] thay đổi theo 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 tính giờ mùa hè [Giờ tiết kiệm ánh sáng ban ngày - DST], nó là quy ước chỉnh sửa đồng hồ tăng thêm một khoảng thời gian [thường là 1 giờ] so với tiêu chuẩn giờ . 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 sáng ban ngày của ngày làm việc từ sớ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ì vậy ta lấy gì làm việc?

Giờ lấy lửa 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 đảo ngược lại chưa chắc đúng vì lý do đã nêu ở trên

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

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

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

  1. Mô-đun
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-20T03:41:16Z'
    
    # Dạng datetime format
    date_time_python = parse[date_string]
    
    0 không bao gồm dữ liệu về múi giờ do múi giờ hay thay đổi
  2. Tuy nhiên, mô-đun
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-20T03:41:16Z'
    
    # Dạng datetime format
    date_time_python = parse[date_string]
    
    0 phải cung cấp api để lưu thông tin về múi giờ vào đối tượng
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-20T03:41:16Z'
    
    # Dạng datetime format
    date_time_python = parse[date_string]
    
    0
  3. Nó nên cung cấp những đối tượng sau.
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-20T03:41:16Z'
    
    # Dạng datetime format
    date_time_python = parse[date_string]
    
    3,
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-20T03:41:16Z'
    
    # Dạng datetime format
    date_time_python = parse[date_string]
    
    4,
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-20T03:41:16Z'
    
    # Dạng datetime format
    date_time_python = parse[date_string]
    
    0 và
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-20T03:41:16Z'
    
    # Dạng datetime format
    date_time_python = parse[date_string]
    
    6

Tuy nhiên, một số không đúng. Vấn đề lớn nhất là chúng ta không thể tính toán đối tượng datetime có múi giờ và đối tượng datetime không có múi giờ chính đó

>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
>>> for tz in some_time_zones:
..     tz, pendulum_time.in_tz[tz]
..     
['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]
0

Một vấn đề khác là có 2 cách để tạo đối tượng datetime vào thời điểm hiện tại trong Python

>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
>>> for tz in some_time_zones:
..     tz, pendulum_time.in_tz[tz]
..     
['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]
1

Một là giờ ở UTC, một là giờ địa phương. Tuy nhiên, nó lại không cho bạn biết múi giờ địa phương cũng là gì với 2 giá trị

import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-20T03:41:16Z'

# Dạng datetime format
date_time_python = parse[date_string]
7 và
import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-20T03:41:16Z'

# Dạng datetime format
date_time_python = parse[date_string]
8 bạn không thể biết được cái nào có múi giờ UTC

Thư viện còn cung cấp đối tượng

import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-20T03:41:16Z'

# Dạng datetime format
date_time_python = parse[date_string]
3 và đối tượng
import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-20T03:41:16Z'

# Dạng datetime format
date_time_python = parse[date_string]
4. Và cả hai đều không có ý nghĩa gì nữa nếu cảm thấy khó chịu khi đến múi giờ. Because if if only
import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-20T03:41:16Z'

# Dạng datetime format
date_time_python = parse[date_string]
4 don't then not enough or if is
import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-20T03:41:16Z'

# Dạng datetime format
date_time_python = parse[date_string]
3 then it only mang tính chất địa phương, it could be the today for my but could be the today over, or day mai for you

Thực hành tốt nhất

Chuyển đổi múi giờ

Nếu bạn muốn tạo đối tượng

import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-20T03:41:16Z'

# Dạng datetime format
date_time_python = parse[date_string]
0 và lưu múi giờ thông tin, bạn không nên truyền
import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-21 03:41:16'

# Strptime
format = '%Y-%m-%d %H:%M:%S'
date_time_python = datetime.datetime.strptime[date_string, format]
4 trong cấu trúc mà nên sử dụng hàm
import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-21 03:41:16'

# Strptime
format = '%Y-%m-%d %H:%M:%S'
date_time_python = datetime.datetime.strptime[date_string, format]
5 do
import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-21 03:41:16'

# Strptime
format = '%Y-%m-%d %H:%M:%S'
date_time_python = datetime.datetime.strptime[date_string, format]
6 cung cấp

>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.from_format['1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ']
>>> for tz in some_time_zones:
..     tz, pendulum_time.in_tz[tz]
..     
['Europe/Paris', DateTime[1996, 3, 25, 17, 3, 0, tzinfo=Timezone['Europe/Paris']]]
['Europe/Moscow', DateTime[1996, 3, 25, 19, 3, 0, tzinfo=Timezone['Europe/Moscow']]]
['America/Toronto', DateTime[1996, 3, 25, 11, 3, 0, tzinfo=Timezone['America/Toronto']]]
['UTC', DateTime[1996, 3, 25, 16, 3, 0, tzinfo=Timezone['UTC']]]
['Canada/Pacific', DateTime[1996, 3, 25, 8, 3, 0, tzinfo=Timezone['Canada/Pacific']]]
['Asia/Macao', DateTime[1996, 3, 26, 0, 3, 0, tzinfo=Timezone['Asia/Macao']]]
2

You can could see with

import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-20T03:41:16Z'

# Dạng datetime format
date_time_python = parse[date_string]
8 it used true offset at the current point is +8

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

If you want to get the current time, always used

import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-21 03:41:16'

# Strptime
format = '%Y-%m-%d %H:%M:%S'
date_time_python = datetime.datetime.strptime[date_string, format]
8. Khi người dùng nhập giờ địa phương, hãy thiết lập chuyển đổi tức thời qua UTC rồi tiếp tục xử lý. Nếu bạn không biết khoảng thời gian của người dùng, hãy hỏi họ, không thể tự đoán dựa trên IP hay số điện thoại di động [đây là ý tưởng thực tế khi mình làm dự án hiện tại]

Không nên sử dụng ngày giờ nhận biết offset

Đối tượng

import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-20T03:41:16Z'

# Dạng datetime format
date_time_python = parse[date_string]
0 là nhận biết offset khi nó lưu thông tin về múi giờ, nếu không thì gọi là offset-navie

Nó có thể là ý tưởng tốt nếu bạn lưu tzinfo trong đối tượng

import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-20T03:41:16Z'

# Dạng datetime format
date_time_python = parse[date_string]
0. Nhưng sẽ tốt hơn nếu bạn không làm như vậy. Hãy tận dụng chế độ hạn chế trong API thiết kế

  • Trong tính toán nội bộ sử dụng đối tượng offset-navie
    import datetime
    import pytz
    from dateutil.parser import parse
    
    # Dạng string time
    date_string = '2019-03-20T03:41:16Z'
    
    # Dạng datetime format
    date_time_python = parse[date_string]
    
    0 và quy ước múi giờ của nó là UTC
  • Khi có giao tiếp với người dùng, hãy chuyển đổi nó qua giờ địa phương

Tại sao bạn nên làm như vậy? . Thứ hai, sử dụng tzinfo trong khi thư viện chuẩn được thiết kế sai là một ý tưởng tệ hại. Đó là lý do tại sao

import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-21 03:41:16'

# Strptime
format = '%Y-%m-%d %H:%M:%S'
date_time_python = datetime.datetime.strptime[date_string, format]
6 cung cấp hàm
import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-21 03:41:16'

# Strptime
format = '%Y-%m-%d %H:%M:%S'
date_time_python = datetime.datetime.strptime[date_string, format]
5 để chuyển đổi múi giờ vì API của thư viện chuẩn không đủ linh hoạt làm việc đó với múi giờ hơn 500. Không sử dụng
import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-21 03:41:16'

# Strptime
format = '%Y-%m-%d %H:%M:%S'
date_time_python = datetime.datetime.strptime[date_string, format]
4 là cơ hội để bạn trở nên tốt hơn

Lý do cuối cùng mà bạn không nên sử dụng offset-aware là do

import datetime
import pytz
from dateutil.parser import parse

# Dạng string time
date_string = '2019-03-21 03:41:16'

# Strptime
format = '%Y-%m-%d %H:%M:%S'
date_time_python = datetime.datetime.strptime[date_string, format]
4 đối tượng của các thư viện của các ngôn ngữ khác nhau [xác định việc thực hiện]. Hiện tại chưa có tiêu chuẩn nào để truyền tzinfo từ ngôn ngữ này sang ngôn ngữ khác hoặc HTTP bên ngoài sử dụng bù UTC như hiện tại

Chủ Đề