2012-11-12 38 views
8

Tôi có một cơ sở dữ liệu lưu trữ datetime như UTC. Tôi cần tra cứu thông tin từ một thời điểm cụ thể, nhưng ngày và thời gian được đưa ra theo giờ địa phương, hãy nói 'Châu Âu/Copenhagen'. Tôi được cung cấp những điều này là:Python pytz: chuyển đổi giờ địa phương thành utc. Localize dường như không chuyển đổi

year = 2012; month = 12; day = 2; hour = 13; min = 1; 

Vì vậy, tôi cần phải chuyển đổi chúng thành UTC để tôi có thể tra cứu chúng trong cơ sở dữ liệu. Tôi muốn làm điều này bằng cách sử dụng pytz. Tôi đang tìm kiếm tại localize:

local_tz = timezone('Europe/Copenhagen') 
t = local_tz.localize(datetime.datetime(year, month, day, hour, min)) 

Nhưng tôi là nhầm lẫn về localize(). Điều này giả định rằng năm đó, vv, được trao cho tôi trong thời gian địa phương? Hoặc, là nó giả định rằng họ được đưa ra trong UTC và bây giờ nó đã chuyển đổi chúng thành giờ địa phương?

print t mang lại cho tôi:

2012-12-02 13:01:00+01:00 

Vì vậy, có vẻ như nó giả định rằng năm ban đầu, vv là trong utc; giờ là 13 + 1 thay vì 13. Giờ tôi nên làm gì? Tôi đã đọc tài liệu về pytz và điều này không làm cho nó rõ ràng hơn với tôi. Nó đề cập rất nhiều rằng mọi thứ rất phức tạp vì vậy tôi không chắc liệu pytz có thực sự giải quyết những vấn đề này hay không. Và, tôi không phải lúc nào cũng biết các ví dụ có cho tôi thấy những thứ hoạt động hay những thứ không hoạt động.

Tôi cố gắng bình thường hóa:

print local_tz.normalize(t) 

Điều đó mang lại cho tôi những kết quả tương tự như in t.

CHỈNH SỬA: Với các số được đưa ra ở trên trong năm, v.v. phải khớp với thông tin trong cơ sở dữ liệu cho 2012-12-2 12:01. (Từ Copenhagen là utc + 1 vào ngày đó)

Trả lời

16

localize() gắn múi giờ để một datetime.datetime dụ ngây thơ trong địa phương múi giờ.

Nếu bạn có giá trị datetime trong một múi giờ địa phương, bản địa hoá để múi giờ đó, sau đó sử dụng .astimezone() để cast giá trị tính theo giờ UTC:

>>> localdt = local_tz.localize(datetime.datetime(year, month, day, hour, min)) 
>>> localdt.astimezone(pytz.UTC) 
datetime.datetime(2012, 12, 2, 12, 1, tzinfo=<UTC>) 

Lưu ý rằng bạn không cần để làm điều này, datetime đối tượng với múi giờ có thể được so sánh; cả hai đều sẽ được bình thường đến UTC cho kỳ thi này:

>>> localdt.astimezone(pytz.UTC) == localdt 
True 
+0

Điều đó cho giờ là 14: 01: 00 + 01: 00. Giờ địa phương chính xác là 13 và giờ utc là 12. – user984003

+0

@ user984003: Ah, xin lỗi, đã đọc sai câu đầu tiên. '.astimezone()' vẫn là con đường để đi, chỉ là một cách khác. –

+0

Vâng, cách thứ hai đó hoạt động, cảm ơn. Có thể bạn chỉ có điều đó trong câu trả lời của bạn, nếu không tôi nghĩ rằng đó là một chút khó hiểu;) Tôi thấy rằng tôi đã nhầm lẫn về ngày in. "+01: 00" nói với tôi rằng đó là một giờ trước utc, không phải là tôi nên thêm một giờ vào thời điểm đó. – user984003

0

Nếu bạn biết các đại diện thời gian đến là trong Europe/Copenhagen múi giờ, bạn có thể tạo ra nó như múi giờ nhận thức để bắt đầu với:

local_tz = timezone('Europe/Copenhagen') 
t = local_tz.localize(datetime.datetime(year, month, day, hour, min)) 

sau đó bạn có thể "chuyển đổi" này để UTC với:

t_utc = t.astimezone(pytz.UTC) 

nhưng điều này có thể không cần thiết, tùy thuộc vào cách lành mạnh tài xế cơ sở dữ liệu của bạn. tt_utc đại diện cho cùng một điểm-trong-thời gian và mã hoạt động tốt nên xử lý chúng thay thế nhau. (year, month, day, hour, minute, second, …) tuple chỉ đơn thuần là biểu diễn có thể đọc được của con người về thời điểm này trong một múi giờ và hệ thống lịch cụ thể.

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