2013-10-22 13 views
17

Tôi đang cố gắng chuyển đổi dấu thời gian ngây thơ luôn ở thời gian Thái Bình Dương thành UTC. Trong đoạn code dưới đây, tôi có thể chỉ định rằng dấu thời gian này tôi có là trong thời gian Thái Bình Dương, nhưng nó dường như không biết rằng nó phải là một bù đắp -7 giờ từ UTC bởi vì nó chỉ có 10/21 và DST có chưa kết thúc.Python: Cách chuyển đổi dấu thời gian nhận biết múi giờ thành UTC mà không biết liệu DST có hiệu lực không

Kịch bản:

import pytz 
import datetime 
naive_date = datetime.datetime.strptime("2013-10-21 08:44:08", "%Y-%m-%d %H:%M:%S") 
localtz = pytz.timezone('America/Los_Angeles') 
date_aware_la = naive_date.replace(tzinfo=localtz) 
print date_aware_la 

Đầu ra:

2013-10-21 08:44:08-08:00 

Nó cần phải có một offset của -07: 00 đến DST kết thúc vào ngày 03 tháng 11. Làm thế nào tôi có thể nhận được ngày nhận biết múi giờ của tôi để có bù đắp chính xác khi DST và không có hiệu lực? Pytz có đủ thông minh để biết rằng DST sẽ có hiệu lực vào ngày 3 tháng 11 không?

Mục tiêu tổng thể: Tôi chỉ đang cố chuyển đổi dấu thời gian thành UTC khi biết rằng tôi sẽ nhận được dấu thời gian trong khoảng thời gian bình thường mà không có bất kỳ dấu hiệu nào cho dù DST có hiệu lực hay không. Tôi không tạo ra ngày này từ python, vì vậy tôi không thể sử dụng utc_now().

Trả lời

22

Sử dụng các phương pháp localize:

import pytz 
import datetime 
naive_date = datetime.datetime.strptime("2013-10-21 08:44:08", "%Y-%m-%d %H:%M:%S") 
localtz = pytz.timezone('America/Los_Angeles') 
date_aware_la = localtz.localize(naive_date) 
print(date_aware_la) # 2013-10-21 08:44:08-07:00 

này được bao phủ trong "Ví dụ & Cách sử dụng" của the pytz documentation.

Và sau đó tiếp tục UTC:

utc_date = date_aware_la.astimezone(pytz.utc) 
print(utc_date) 
+3

để khẳng định rằng 'naive_date' là rõ ràng và tồn tại, bạn có thể vượt qua 'is_dst = None' cho' bản địa hoá() '; nếu không thì thời gian sai có thể được chọn âm thầm. – jfs

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