Tôi cần làm gì
Tôi có một đối tượng datetime không biết múi giờ, mà tôi cần thêm một múi giờ để có thể so sánh nó với các đối tượng datetime nhận biết múi giờ khác. Tôi không muốn chuyển đổi toàn bộ ứng dụng của mình sang múi giờ mà không biết về trường hợp kế thừa này.
Những gì tôi đã thử
Đầu tiên, để chứng minh vấn đề:
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> import pytz
>>> unaware = datetime.datetime(2011,8,15,8,15,12,0)
>>> unaware
datetime.datetime(2011, 8, 15, 8, 15, 12)
>>> aware = datetime.datetime(2011,8,15,8,15,12,0,pytz.UTC)
>>> aware
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> aware == unaware
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes
Đầu tiên, tôi đã thử astimezone:
>>> unaware.astimezone(pytz.UTC)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: astimezone() cannot be applied to a naive datetime
>>>
Điều này không có gì đáng ngạc nhiên khi điều này thất bại, vì nó thực sự đang cố gắng thực hiện một chuyển đổi. Thay thế có vẻ như là một lựa chọn tốt hơn (theo Python: Làm thế nào để có được giá trị của datetime.today () là "nhận biết múi giờ"? ):
>>> unaware.replace(tzinfo=pytz.UTC)
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> unaware == aware
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes
>>>
Nhưng như bạn có thể thấy, thay thế dường như để đặt tzinfo, nhưng không làm cho đối tượng nhận biết. Tôi đã sẵn sàng quay trở lại để kiểm tra chuỗi đầu vào để có múi giờ trước khi phân tích cú pháp (Tôi đang sử dụng dateutil để phân tích cú pháp, nếu điều đó quan trọng), nhưng điều đó có vẻ vô cùng khó hiểu.
Ngoài ra, tôi đã thử điều này trong cả python 2.6 và python 2.7, với cùng kết quả.
Bối cảnh
Tôi đang viết một trình phân tích cú pháp cho một số tệp dữ liệu. Có một định dạng cũ tôi cần hỗ trợ khi chuỗi ngày không có chỉ báo múi giờ. Tôi đã sửa nguồn dữ liệu, nhưng tôi vẫn cần hỗ trợ định dạng dữ liệu cũ. Chuyển đổi một lần dữ liệu kế thừa không phải là một lựa chọn cho các lý do BS kinh doanh khác nhau. Mặc dù nói chung, tôi không thích ý tưởng mã hóa cứng một múi giờ mặc định, nhưng trong trường hợp này có vẻ như đó là lựa chọn tốt nhất. Tôi biết với sự tự tin hợp lý rằng tất cả các dữ liệu kế thừa được đề cập là trong UTC, vì vậy tôi đã sẵn sàng chấp nhận rủi ro vỡ nợ trong trường hợp này.
import datetime; datetime.datetime.now(datetime.timezone.utc)
tz
arg được đặt tên để dễ đọc hơn:datetime.datetime.now(tz=datetime.timezone.utc)
unaware.replace()
sẽ trở lạiNone
nếu nó đang sửa đổiunaware
đối tượng tại chỗ. REPL cho thấy.replace()
trả về mộtdatetime
đối tượng mới ở đây.