Ok hãy để tôi bắt đầu bằng cách nói múi giờ của tôi là CET/CEST. Thời điểm chính xác nó thay đổi từ CEST thành CET (từ DST, là GMT + 2, thành bình thường, mà GMT + 1, do đó) luôn là Chủ nhật cuối cùng của tháng 10 lúc 3 giờ sáng. Vào năm 2010, đây là ngày 31 tháng 10.Lấy đúng múi giờ bù đắp bằng Python sử dụng múi giờ địa phương
Bây giờ lưu ý những điều sau:
>>> import datetime
>>> import pytz.reference
>>> local_tnz = pytz.reference.LocalTimezone()
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 3600)
Đây là sai như đã giải thích ở trên.
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 30, 2, 12, 30))
datetime.timedelta(0, 7200)
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 7200)
Bây giờ nó là đột nhiên đúng:/
Tôi biết có một số câu hỏi về vấn đề này đã có, nhưng các giải pháp đưa ra luôn là "sử dụng Localize", nhưng vấn đề của tôi ở đây là LocalTimezone không cung cấp phương pháp đó.
Thực tế, tôi có một vài dấu thời gian tính bằng mili giây mà tôi cần utcoffset múi giờ địa phương (không chỉ của tôi, mà là của bất kỳ ai sử dụng chương trình). Một trong số này là 1288483950000 hoặc CN ngày 31 tháng 10 năm 2010 02:12:30 GMT + 0200 (CEST) trong múi giờ của tôi.
Hiện nay tôi làm như sau để có được những đối tượng datetime:
datetime.datetime.fromtimestamp(int(int(millis)/1E3))
và điều này để có được những UTCOFFSET trong vài phút:
-int(local_tnz.utcoffset(date).total_seconds()/60)
đó, không may, là sai trong nhiều dịp :(.
Bất kỳ ý tưởng nào?
Lưu ý: Tôi đang sử dụng python3.2.4, không phải vậy nó sẽ quan trọng trong trường hợp này.
EDIT:
Tìm thấy giải pháp nhờ @JamesHolderness:
def datetimeFromMillis(millis):
return pytz.utc.localize(datetime.datetime.utcfromtimestamp(int(int(millis)/1E3)))
def getTimezoneOffset(date):
return -int(date.astimezone(local_tz).utcoffset().total_seconds()/60)
Với local_tz bằng tzlocal.get_localzone() từ các mô-đun tzlocal.
Sử dụng Python 2.7.5 và pytz 2013b, tôi nhận được các kết quả khác nhau và nhất quán: 'datetime.timedelta (0, 3600)'. 'datetime.timedelta (0, 7200)', và 'datetime.timedelta (0, 3600)' tương ứng. Tôi đặt múi giờ của mình thành CET trước khi chạy thử nghiệm. – martineau
Cố gắng tự đi qua các dòng trong hàm utcoffset và _isdst trên một cli, xem mã tại đây: http://bazaar.launchpad.net/~stub/pytz/devel/view/head:/src/pytz/reference .py Xem bạn có thể thấy điều gì sai không. – ojs
liên quan: [Nhận bù đắp UTC của máy tính bằng Python] (http://stackoverflow.com/q/3168096/4279) – jfs