2012-12-21 34 views

Trả lời

47

Sử dụng tz.localize(d) để bản địa hoá các ví dụ. Từ documentation:

Đầu tiên là sử dụng phương thức localize() do thư viện pytz cung cấp. Này được sử dụng để bản địa hoá một datetime ngây thơ (datetime không có thông tin múi giờ):

>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0)) 
>>> print(loc_dt.strftime(fmt)) 
2002-10-27 06:00:00 EST-0500 

Nếu bạn không sử dụng tz.localize(), nhưng sử dụng datetime.replace(), rất có thể là một lịch sử bù đắp được sử dụng thay ; tz.localize() sẽ chọn hiệu ứng bù đắp đúng cho ngày đã cho. Ví dụ, ngày bắt đầu và ngày kết thúc DST của miền Đông Hoa Kỳ đã thay đổi theo thời gian.

Khi bạn cố gắng bản địa hóa giá trị ngày giờ mơ hồ vì nó nằm trong khoảng thời gian chuyển tiếp từ mùa hè đến mùa đông hoặc ngược lại, múi giờ sẽ được tham khảo để xem đối tượng ngày giờ kết quả có phải trả về True hay False hay không. . Bạn có thể ghi đè mặc định cho các múi giờ với lập luận is_dst từ khóa cho .localize():

dt = tz.localize(naive, is_dst=True) 

hoặc thậm chí tắt sự lựa chọn hoàn toàn bằng cách thiết lập is_dst=None. Trong trường hợp đó, hoặc trong các trường hợp hiếm hoi, không đặt mặc định cho múi giờ, giá trị ngày giờ mơ hồ sẽ dẫn đến một ngoại lệ AmbiguousTimeError được tăng lên. Cờ is_dst chỉ được tham khảo cho các giá trị datetime không rõ ràng và bị bỏ qua nếu không.

Để quay trở lại theo cách khác, bật một đối tượng múi giờ nhận thức về một đối tượng ngây thơ, sử dụng .replace(tzinfo=None):

naivedt = awaredt.replace(tzinfo=None) 
+0

Giải pháp hoàn hảo, cảm ơn. – waitingkuo

+0

Có cách nào thuận tiện để có được 'datetime' ngây thơ từ' datetime' có tzinfo không? – waitingkuo

+4

@waitingkuo: gọi '.replace (tzinfo = None)' trên đối tượng 'datetime'. Giá trị trả về là một thể hiện 'datetime' ngây thơ. –

2

Nếu bạn biết rằng datetime ban đầu của bạn là "đo" theo múi giờ bạn cố gắng thêm vào nó, bạn có thể (nhưng có lẽ không nên) sử dụng replace thay vì localize.

# d = datetime.datetime.now() 
# tz = pytz.timezone('Asia/Taipei') 
d = d.replace(tzinfo=tz) 

tôi có thể tưởng tượng 2 lần khi điều này có thể có ý nghĩa (điều thứ hai xảy ra với tôi):

  1. locale Máy chủ của bạn được thiết lập để các múi giờ không chính xác và bạn đang cố gắng để sửa chữa một datetime Ví dụ bằng cách làm cho nó nhận biết múi giờ không chính xác này (và có lẽ sau đó bản địa hoá nó thành múi giờ "chính xác" để các giá trị của bây giờ() phù hợp với thời gian khác bạn đang so sánh nó với (đồng hồ của bạn, có lẽ)
  2. Bạn muốn để "gắn thẻ" một cá thể time (NOT a datetime) với thuộc tính múi giờ (tzinfo) để thuộc tính có thể được sử dụng sau này để tạo thành một phiên bản datetime đầy đủ.
Các vấn đề liên quan