2011-09-20 25 views
7

Vì vậy, tôi hiện đang có một dòng mã mà trông như thế này:Python DST & Time Zone Detection Sau Addition

 t1 = datetime(self.year, self.month, self.day, self.hour, self.minute, self.second) 
     ... 
     t2 = timedelta(days=dayNum, hours=time2.hour, minutes=time2.minute, seconds=time2.second) 
     sumVal = t1 + t2 

Tôi muốn cho kết quả để đưa vào tài khoản bất kỳ DST ảnh hưởng có thể xảy ra (ví dụ như nếu tôi vào lúc 11/4/2012 00:30 sáng và thêm 3 giờ nữa, tôi sẽ nhận được 02:30 sáng, do sự sụt giảm cho DST). Tôi đã xem xét sử dụng pytz và python-dateutil, và không ai trong số họ dường như hỗ trợ điều này, hoặc ít nhất là không hỗ trợ nó mà không có một tập tin riêng biệt có chứa tất cả các múi giờ. Các kicker là thời gian có thể không nhất thiết phải được trong cùng một múi giờ như hệ thống hiện tại, hoặc thậm chí là trong quá khứ. Tôi chắc chắn có một cách đơn giản để làm điều này (hoặc tôi mong đợi như vậy trong Python), nhưng không có gì có vẻ là những gì tôi cần ngay bây giờ. Bất kỳ ý tưởng?

Trả lời

5

lẽ pytz 's phương pháp normalize là những gì bạn đang tìm kiếm:

import datetime as dt 
import pytz 

tz=pytz.timezone('Europe/London') 
t1 = dt.datetime(2012,10,28,0,30,0) 
t1=tz.localize(t1) 
t2 = dt.timedelta(hours=3) 
sumVal = t1 + t2 

sumVal vẫn nằm trong BST:

print(repr(sumVal)) 
# datetime.datetime(2012, 10, 28, 3, 30, tzinfo=<DstTzInfo 'Europe/London' BST+1:00:00 DST>) 

Sau khi bình thường hóa, sumVal là trong giờ:

sumVal = tz.normalize(sumVal) 
print(repr(sumVal)) 
# datetime.datetime(2012, 10, 28, 2, 30, tzinfo=<DstTzInfo 'Europe/London' GMT0:00:00 STD>) 

Lưu ý, đối với London, DST chuyển đổi xảy ra tại 2012-10-28 02:00:00.

Các vấn đề liên quan