2009-11-05 35 views

Trả lời

7
>>> import datetime 
>>> today = datetime.datetime.now() 
>>> insummer = datetime.datetime(2009,8,15,10,0,0) 
>>> from pytz import reference 
>>> localtime = reference.LocalTimezone() 
>>> localtime.tzname(today) 
'PST' 
>>> localtime.tzname(insummer) 
'PDT' 
>>> 
+4

[' pytz' docs nói rằng 'pytz.reference'] (http://pytz.sourceforge.net/#problems-with-localtime) nên được sử dụng * chỉ cho các bài kiểm tra *. – jfs

+0

Cảnh báo đó áp dụng cho 'reference.USTimeZone', sử dụng các quy tắc trước năm 2007 cho DST Hoa Kỳ. Tuy nhiên 'reference.LocalTimezone', được sử dụng ở đây, thăm dò hành vi của' time.localtime', có độ chính xác được duy trì với các thư viện hệ thống. 'reference.LocalTimezone' cung cấp các chuyển tiếp DST chính xác cả trước và sau khi thay đổi quy tắc của Hoa Kỳ năm 2007; Tôi chưa thử nghiệm cho các quốc gia khác. – rob

+2

@rob: ** sai **. Không sử dụng 'LocalTimezone()'. 'pytz' cung cấp dữ liệu múi giờ * lịch sử * trong khi' time.timezone', 'time.altzone' (được sử dụng bởi' LocalTimezone() ') là hằng số nghĩa là, tốt nhất chúng phản ánh * định nghĩa múi giờ gần đây nhất *. Múi giờ địa phương có thể có các chênh lệch utc khác nhau trong quá khứ/tương lai, ví dụ: thử múi giờ Châu Âu/Moscow trong năm 2010-2015 và xem điều gì xảy ra cho chính bạn. – jfs

2

time.timezone lợi nhuận múi giờ hiện tại bù đắp. cũng có một datetime.tzinfo, nếu bạn cần cấu trúc phức tạp hơn.

+0

time.timezone() vừa trả về khoản chênh lệch từ UTC. tôi muốn một đối tượng tzinfo. vì vậy tôi có thể sẽ có chức năng để: 1. xác định một lớp tương ứng với đối tượng tzinfo 2. instanciate đối tượng 3. trả lại tài liệu –

+0

'datetime' có một ví dụ giải thích việc sử dụng' tzinfo'. – SilentGhost

+0

'datetime.datetime.now() + datetime.timedelta (seconds = time.timezone)' đã thực hiện thủ thuật độc đáo. – Baczek

0

Tôi chưa tự mình sử dụng, nhưng dateutil.tz.tzlocal() nên thực hiện thủ thuật.

http://labix.org/python-dateutil#head-50221b5226c3ccb97daa06ea7d9abf0533ec0310

+0

'tzlocal()' có thể thất bại cho các ngày trong quá khứ, ví dụ, múi giờ 'Europe/Moscow'' có chênh lệch utc khác nhau trước năm 2011 (' dateutil' không thành công, nhưng 'pytz' hoạt động cho các múi giờ đó) – jfs

0

Có thể thử:

import time

print time.tzname #or time.tzname[time.daylight]

+0

So sánh điều này với câu trả lời đầu tiên, tại sao -1? –

+0

['time.daylight'] cho biết múi giờ hiện tại có DST hay không. Nó không cho biết liệu DST có hiệu lực ngay bây giờ hay không. 'Time.tzname' cũng không phải là một cá thể' tzinfo' (nó là một chuỗi). Xem [Làm thế nào để có được thiết lập múi giờ hệ thống và vượt qua nó để pytz.timezone?] (Http://stackoverflow.com/q/13218506/4279) để hiểu rằng ngay cả khi bạn sẽ nhận được đúng tzname; nó sẽ không có nghĩa là bạn sẽ tìm thấy múi giờ địa phương. Xem [Lấy bù trừ utc của máy tính bằng Python] (http://stackoverflow.com/a/3168394/4279) để minh họa một số cách tiếp cận để có được độ lệch utc hiện tại. – jfs

7

tzlocal module trả pytz múi giờ hoạt động trên * nix và win32:

from datetime import datetime 
from tzlocal import get_localzone # $ pip install tzlocal 

# get local timezone  
local_tz = get_localzone() 


print local_tz.localize(datetime(2012, 1, 15)) 
# -> 2012-01-15 00:00:00+04:00 # current utc offset 
print local_tz.localize(datetime(2000, 1, 15)) 
# -> 2000-01-15 00:00:00+03:00 # past utc offset (note: +03 instead of +04) 
print local_tz.localize(datetime(2000, 6, 15)) 
# -> 2000-06-15 00:00:00+04:00 # changes to utc offset due to DST 

Lưu ý: tính đến cả thay đổi bù trừ DST và không phải DST.

-1

Tôi đã yêu cầu như vậy để bản thân mình, và tôi thấy câu trả lời trong [1]:

Hãy xem phần 8.1.7: định dạng "% z" (chữ thường, chữ hoa Z lợi nhuận cũng là múi giờ, nhưng không theo định dạng 4 chữ số, nhưng dưới dạng các chữ viết tắt múi giờ, như trong [3]) của strftime trả về dạng "+/- 4DIGIT" là tiêu chuẩn trong tiêu đề email (xem phần 3.3 của RFC 2822 , xem [2], lỗi thời theo các cách khác để chỉ định múi giờ cho tiêu đề email).

Vì vậy, nếu bạn muốn múi giờ của bạn ở định dạng này, sử dụng:

time.strftime("%z") 

[1] http://docs.python.org/2/library/datetime.html

[2] http://tools.ietf.org/html/rfc2822#section-3.3

[3] viết tắt múi giờ: http://en.wikipedia.org/wiki/List_of_time_zone_abbreviations, chỉ cho tài liệu tham khảo.

+0

Nó không cho đối tượng 'tzinfo'. Bạn có thể nhận được độ lệch utc hiện tại cho múi giờ địa phương như số giây: '-altzone nếu ánh sáng ban ngày và localtime(). Tm_isdst> 0 else -timezone' (tất cả các tên là từ' time' module). – jfs

3

Đoạn mã sau đây trả về thời gian trong một múi giờ khác nhau bất kể múi giờ được định cấu hình trên máy chủ.

# pip install pytz tzlocal 

from tzlocal import get_localzone 
from datetime import datetime 
from pytz import timezone 

local_tz = get_localzone() 
local_datetime = datetime.now(local_tz) 

zurich_tz = timezone('Europe/Zurich') 
zurich_datetime = zurich_tz.normalize(local_datetime.astimezone(zurich_tz)) 
+1

là có một lý do, không sử dụng 'zurich_datetime = datetime.now (múi giờ ('Châu Âu/Zurich'))' ở đây? btw, [không cần phải gọi '.normalize()' sau '.astimezone()'] (https://answers.launchpad.net/pytz/+question/249229#6) – jfs

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