2009-11-05 2 views

답변

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 그 'pytz.reference'] (http://pytz.sourceforge.net/#problems-with-localtime)는 테스트에만 사용되어야합니다 *. – jfs

+0

이 경고는 미국 DST에 2007 이전 규칙을 사용하는'reference.USTimeZone'에 적용됩니다. 그러나 여기에서 사용되는'reference.LocalTimezone'은'time.localtime'의 동작을 검사합니다.'time.localtime'은 시스템 라이브러리에서 정확성이 유지됩니다. 'reference.LocalTimezone'은 미국 규칙의 2007 년 변경 전후의 올바른 DST 전환을 제공합니다. 나는 다른 나라들을 위해 시험하지 않았다. – rob

+2

@rob : ** 잘못된 **. 'LocalTimezone()'을 사용하지 마십시오. 'pytz'는 * 역사적인 시간대 데이터를 제공하지만'time.timezone','time.altzone' ('LocalTimezone()'에 의해 사용됨)은 상수입니다. 즉, 가장 최근의 * 시간대 정의를 반영합니다. 과거/미래에 현지 시간대가 다른 utc 오프셋을 가질 수 있습니다. 예를 들어 2010-2015 년 유럽/모스크바 시간대를 사용해보고 어떻게되는지 직접 확인하십시오. – jfs

2

time.timezone 수익률은 현재 시간대 오프셋 크로스 플랫폼 아니기 때문에

환경 변수에 계산 될 수 없다. 더 복잡한 구조가 필요하다면 datetime.tzinfo도 있습니다.

+0

time.timezone()은 UTC에서 오프셋을 반환합니다. 나는 tzinfo 객체를 원한다. 그래서 나는 아마도 다음과 같은 함수가 될 것이다. 1. tzinfo 객체에 해당하는 클래스를 정의한다. 2. 객체를 인스턴스화한다. 3. 리턴 값 –

+0

'datetime' docs는'tzinfo'의 사용법을 설명하는 예제를 가지고있다. – SilentGhost

+0

'datetime.datetime.now() + datetime.timedelta (seconds = time.timezone)'트릭을 멋지게 처리했습니다. – Baczek

0

아마 시도 :

import time

print time.tzname #OR pytz 시간대를 반환 time.tzname[time.daylight]

+0

첫 번째 답변 인 이유 -1과 비교해보십시오. –

+0

['time.daylight']는 현재 시간대에 DST가 있는지 여부를 나타냅니다. 현재 DST가 적용되는지 여부를 나타내지는 않습니다. 또한'time.tzname'은'tzinfo' 인스턴스가 아닙니다 (문자열입니다). 올바른 tzname을 얻을지라도 [시스템 시간대 설정을 얻고 pytz.timezone에 전달하는 방법] (http://stackoverflow.com/q/13218506/4279)을 참조하십시오. 현지 시간대를 찾을 수있는 것은 아닙니다. 현재 utc 오프셋을 얻기위한 몇 가지 접근법을 보여주는 [Python에서 컴퓨터의 utc 오프셋 가져 오기] (http://stackoverflow.com/a/3168394/4279)를 참조하십시오. – jfs

7

tzlocal module이 * nix에서 스크립트 및 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 

참고 : DST 및 비 DST utc 오프셋 변경 사항을 고려합니다.

-1

내가 나 자신에게 같은 질문했다, 나는 [1]에서 답을 찾을 :

섹션 8.1.7를 살펴 보자 형식 "%의 Z를"(소문자의 Z 대문자 반환도 표준 시간대이지만 4 자리 형식은 아니지만 [3]에서와 같이 시간대 약어 형식으로) strftime의 형식은 전자 메일 헤더에 표준 인 "+/- 4DIGIT"형식을 반환합니다 (RFC 2822의 3.3 절 참조). , 이메일 헤더의 시간대를 지정하는 다른 방법을 폐지하는 [2] 참조). 이 형식에서 시간대를 원하는 경우

그래서, 사용

time.strftime("%z") 

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

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

[3] 시간대 약어 : http://en.wikipedia.org/wiki/List_of_time_zone_abbreviations를에만 참고.

+0

'tzinfo' 객체를 제공하지 않습니다. 현지 시간대에 대한 현재 utc 오프셋을 초 수로 얻을 수 있습니다 :'-altzone daylight and localtime() .tm_isdst> 0 else -timezone' (모든 이름은'time' 모듈에 있습니다). – jfs

3

다음 코드 조각은 서버에 구성된 표준 시간대와 관계없이 다른 시간대의 시간을 반환합니다.

# 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

여기에 'zurich_datetime = datetime.now (timezone ('Europe/Zurich '))'를 사용하지 않는 이유가 무엇입니까? btw, [.astimezone()'] (https://answers.launchpad.net/pytz/+question/249229#6) 다음에'.normalize()'를 호출 할 필요는 없습니다. – jfs

관련 문제