Tôi hiện đang làm việc trên chương trình phụ trợ cho một hệ thống lịch trả về các thời gian sử dụng Python ngây thơ. Cách giao diện người dùng hoạt động là người dùng tạo các sự kiện lịch khác nhau và giao diện người dùng trả về phiên bản ngây thơ của sự kiện mà họ đã tạo (ví dụ: nếu người dùng chọn ngày 5 tháng 10 năm 2020 từ 3:00 giờ chiều đến 4:00 giờ chiều, giao diện người dùng sẽ trả về datetime.datetime (2020, 10, 5, 15, 0, 0) là ngày bắt đầu và datetime.datetime (2011, 10, 5, 16, 0, 0) làm kết thúc.Làm thế nào để bạn chuyển đổi một datetime ngây thơ thành DST-aware datetime bằng Python?
Những gì tôi cần làm là Mỗi người dùng của hệ thống đã chỉ định tùy chọn múi giờ của họ, do đó, thời gian chờ ngây thơ được coi là cùng một múi giờ như tùy chọn múi giờ của họ. được lưu trữ tương đối so với UTC sao cho nếu người dùng thay đổi múi giờ của họ, các sự kiện hiện tại sẽ vẫn hiển thị vào đúng thời điểm họ đã lên lịch cho họ.
Giao diện người dùng nằm ngoài tầm kiểm soát của tôi, vì vậy tôi không thể thay đổi dữ liệu tôi nhận được. Thiết kế cơ sở dữ liệu cũng nằm ngoài tầm kiểm soát của tôi, vì vậy tôi không thể thay đổi dữ liệu nào đang được lưu trữ và cách thực hiện.
Dưới đây là cách tiếp cận gần đúng tôi đã lấy cho đến nay:
import pytz
def convert_to_UTC(naive_datetime, user_tz_preference):
user_datetime = naive_datetime.replace(tzinfo=user_tz_preference)
utc_datetime = user_datetime.astimezone(pytz.utc)
Vấn đề tôi chạy vào có liên quan đến Daylight Savings Time:
>>> from datetime import datetime
>>> import pytz
>>> user_tz_preference = pytz.timezone('US/Pacific')
>>> naive_datetime = datetime(2011, 10, 26, 12, 0, 0)
>>> user_datetime = naive_datetime.replace(tzinfo=user_tz_preference)
>>> user_datetime
datetime.datetime(2011, 10, 26, 12, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>)
>>> received_utc = user_datetime.astimezone(pytz.utc)
>>> received_utc
datetime.datetime(2011, 10, 26, 20, 0, tzinfo=<UTC>)
>>> expected_utc = datetime(2011, 10, 26, 19, 0, tzinfo=pytz.utc)
>>> expected_utc == received_utc
False
Chú ý rằng việc sử dụng 'thay thế' thiết lập múi giờ đến PST thay vì PDT bất kể ngày tháng, nó cho nó một khoản chênh lệch UTC là 8 giờ thay vì 7 giờ DST dự kiến, do đó thời gian kết thúc được lưu không chính xác.
Tôi có các tùy chọn nào để chuyển đổi ngày giờ ngây thơ sang đúng PDT (hoặc DST thời gian tương đối khác)?
(Ngoài ra, xin lưu ý rằng không phải tất cả người dùng sống trong múi giờ quan sát DST hoặc có thể sống trong múi giờ chuyển sang các thời điểm khác nhau, để thực hiện giải pháp như chỉnh sửa timedelta trước khi lưu cần phải biết múi giờ có hỗ trợ DST hay không và vào ngày nào nó chuyển qua).
http://www.enricozini.org/2009/debian/using-python-datetime/ –
thể trùng lặp của [Làm thế nào để làm cho một datetime múi giờ không biết nhận biết trong python] (http://stackoverflow.com/questions/7065164/how-to-make-an-unaware-datetime-timezone-aware-in-python) – Pureferret