2010-06-02 2 views
47

나는이 문제를 해결하기 위해 힘든 시간을 보내는 것 같습니다.Python - calendar.timegm() vs. time.mktime()

calendar.timegm()time.mktime()의 차이점은 무엇입니까?

tzinfo가 첨부되지 않은 datetime.datetime이 있다고 말하면 두 개가 동일한 출력을 제공하지 않아야합니까? 그들은 에포크와 매개 변수로 전달 된 날짜 사이의 초 수를 제공하지 않습니까? 그리고 전달 된 날짜 이후에 tzinfo가 없으므로 그 초 수가 동일하지 않습니까?

>>> import calendar 
>>> import time 
>>> import datetime 
>>> d = datetime.datetime(2010, 10, 10) 
>>> calendar.timegm(d.timetuple()) 
1286668800 
>>> time.mktime(d.timetuple()) 
1286640000.0 
>>> 
+1

자세한 내용은 http://stackoverflow.com/questions/15447632/python-convert-utc-time-tuple-to-utc-timestamp – treecoder

답변

78

time.mktime()은 전달 된 튜플이 현지 시간임을 가정하면 calendar.timegm()은 GMT/UTC로 가정합니다. 해석에 따라 튜플은 다른 시간을 나타내므로 함수는 다른 값을 반환합니다 (신기원은 UTC 기반이므로 초).

값의 차이는 현지 시간대의 시간대 오프셋과 같아야합니다.

+0

오, 알겠습니다. 근본적으로 timegm은 UTC를 통과 한 것으로 가정하고 1970/01.01 UTC의 차이를 만듭니다. 반면 mktime은 내 시간대 오프셋을 추가하여 UTC로 전달한 내용을 변환하고 무엇을합니까? 거기서부터 시간이 왔어? – ibz

+0

하지만 내 datetime의 tzinfo가 None이면 mktime은 변환을 수행합니까? 그것은 그대로 두어야합니까? 왜 그것이 현지 시간대에 있다고 가정합니까? – ibz

+2

@ibz :'mktime()'에 주어진'timetuple' 매개 변수는 시간대 정보를 포함하지 않습니다 (절대로'timetuple'에 시간대 필드가 없습니다). 따라서이 함수는 어떤 시간대를 "추측"해야하며'mktime()'은 항상 그것이 현지 시간이라고 가정합니다. 그것은 함수가 동작하는 방법입니다. – sth

7

calendar.timegm은 UTC 타임 스탬프, time.mktime converts from local time not UTC에서 변환합니다.

결과가 8 시간 차이가 나는 것은 사용자 위치의 시간대와 정확하게 일치합니다.

+2

좀 더 정확히 말하자면 timegm은 주어진 날짜를 UTC로 해석하고 타임 스탬프를 반환하며, mktime은 주어진 날짜를 현지 시간으로 해석하여 타임 스탬프를 반환합니다. –

+0

@Greg : 수정 됨. misread the docs :) – SilentGhost