thể trùng lặp:
Weird timezone issue with pytzPYTZ 'Mỹ/Edmonton' bù đắp sai
Điều này có vẻ sai:
>>> import pytz
>>> z1 = timezone('America/Edmonton')
>>> z2 = timezone('US/Mountain')
>>> z1
<DstTzInfo 'America/Edmonton' LMT-1 day, 16:26:00 STD>
>>> z2
<DstTzInfo 'US/Mountain' MST-1 day, 17:00:00 STD>
>>> pytz.VERSION
'2012f'
>>>
'Mỹ/Edmonton' và 'Mỹ/Đông 'phải là cùng múi giờ (17:00:00 STD). Chưa kể đến 16:26:00 không có ý nghĩa gì cả.
- Cập nhật -
Trên đây có ý nghĩa trong bối cảnh của câu trả lời của Jon Skeet. Tuy nhiên, mọi thứ trở nên lạ khi tôi làm điều này:
>>> d = datetime.now()
>>> d
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706)
Tôi đã tạo một ngày ngây thơ. Kể từ khi 'Mỹ/Edmonton' là múi giờ của tôi, tôi cố gắng thiết lập đó bằng tay:
>>> d2 = d.replace(tzinfo=timezone('America/Edmonton'))
>>> d2
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706, tzinfo=<DstTzInfo 'America/Edmonton' LMT-1 day, 16:26:00 STD>)
này không nên thay đổi bất cứ điều gì vì đó là TZ đúng. Tuy nhiên:
>>> d2.astimezone(timezone('US/Eastern'))
datetime.datetime(2012, 10, 9, 18, 55, 41, 644706, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)
này nên cung cấp cho tôi một bù đắp là 2 giờ (chênh lệch giữa 'Mỹ/Đông' và 'Mỹ/Edmonton') nhưng nó mang lại cho tôi 3 giờ 26 phút (đó là 2 giờ cộng một giờ 26 phút: D)
chèn timezone('US/Mountain')
tạo kết quả chính xác trong astimezone()
. Tạo một ngày giờ nhận thức với 'America/Edmonton' cũng sẽ hoạt động chính xác.
Điều gì xảy ra khi bạn tạo 'datetime' với múi giờ hiện tại để bắt đầu, thay vì sử dụng' thay thế'? (Nó trông như thế này về cơ bản bị hỏng ...) –
Sau đó, nó hoạt động tốt. Đáng buồn thay đó không phải là một lựa chọn trong trường hợp của tôi kể từ khi datetime ngây thơ được trả về bởi một hàm khác mà tôi không có quyền kiểm soát: ( – Goro