2010-02-25 3 views
4

Feb 25 2010, 16:19:20 CET의 날짜 시간 문자열을 유닉스 시대로 변환하려면 어떻게해야합니까?UTC에 대한 시간대 약어의 해석

현재 나의 가장 좋은 방법 time.strptime()를 사용하는 것은 이것이다 :

def to_unixepoch(s): 
    # ignore the time zone in strptime 
    a = s.split() 
    b = time.strptime(" ".join(a[:-1]) + " UTC", "%b %d %Y, %H:%M:%S %Z") 
    # this puts the time_tuple(UTC+TZ) to unixepoch(UTC+TZ+LOCALTIME) 
    c = int(time.mktime(b)) 
    # UTC+TZ 
    c -= time.timezone 
    # UTC 
    c -= {"CET": 3600, "CEST": 2 * 3600}[a[-1]] 
    return c 

내가이를 단순화하기 위해 다른 사람의 사이에서 calendar.timegm()pytz을 사용하는 것이 가능할 수도 다른 질문에서 볼 수 있지만,이 확실하지 않다면 단축 된 시간대.

최소의 초과 라이브러리가 필요한 솔루션을 원합니다. 가능한 한 표준 라이브러리를 유지하고 싶습니다.

+0

그래, 나는 내 자신의 임의의 시간대 약어 조회도 끝냈다. 전 세계적으로 같은 약어로 여러 시간대가 있기 때문에 일반적인 경우는 해결할 수 있다고 생각하지 않습니다. – bobince

+0

@bobince : ok 나는 뭔가를 놓치지 않는 것을 알고있다. 나는 내 위의 방법에 대해 훨씬 더 안전하게 느끼게하는이 멋진 링크를 발견했다 : http://www.timeanddate.com/library/abbreviations/timezones/ –

답변

7

파이썬 표준 라이브러리는 실제로 시간대를 구현하지 않습니다. python-dateutil을 사용해야합니다. 표준 시간대 구현 및 파서를 포함하여 표준 datetime 모듈에 유용한 확장을 제공합니다.

시간대를 인식하는 datetime 개체를 .astimezone(dateutil.tz.tzutc())으로 UTC로 변환 할 수 있습니다. 현재 시간대를 인식하는 datetime 개체의 경우 datetime.datetime.utcnow().replace(tzinfo=dateutil.tz.tzutc())을 사용할 수 있습니다.

import dateutil.tz 

cet = dateutil.tz.gettz('CET') 

cesttime = datetime.datetime(2010, 4, 1, 12, 57, tzinfo=cet) 
cesttime.isoformat() 
'2010-04-01T12:57:00+02:00' 

cettime = datetime.datetime(2010, 1, 1, 12, 57, tzinfo=cet) 
cettime.isoformat() 
'2010-01-01T12:57:00+01:00' 

# does not automatically parse the time zone portion 
dateutil.parser.parse('Feb 25 2010, 16:19:20 CET')\ 
    .replace(tzinfo=dateutil.tz.gettz('CET')) 

불행히도이 기술은 반복되는 일광 절약 시간제 시간 동안 잘못 될 것입니다.

+1

무엇을 기다리는가? 나는 유닉스 시대가 보편적이라고 생각했다. 0은 GMT 자정이며 CET는 오전 1 시가됩니다. 지역은 앞뒤로 time_tuple로 갈 때만 작용합니다. –

+0

맞습니다. time.time()은 UTC로 가정됩니다. – joeforker

+0

확인을 해줘서 고마워. 내가 틀렸다면 내 세계를 산산조각 냈을거야 :) –