순진한 datetime
대 인식datetime
기본 datetime
개체는 "순진한"이라고합니다. 시간대 정보없이 시간 정보를 유지합니다. 순진한 출처가 명확한 출처가없는 datetime
상대 숫자 (예 :) 로 생각하십시오 +4
(실제로 출처는 시스템 경계 전체에서 공통적입니다).
반대로, 인식 은 전 세계의 공통된 기원을 가진 datetime
절대 숫자 (예 :) 로 생각 8
하십시오.
시간대 정보가 없으면 "순진한"날짜 시간을 순진하지 않은 시간 표현으로 변환 할 수 없습니다 ( +4
어디에서 시작해야할지 모를 경우 대상은 어디에 있습니까?). 이것이 당신이 datetime.datetime.toutctimestamp()
방법을 가질 수없는 이유 입니다. (cf : http://bugs.python.org/issue1457227 )
당신이 있는지 확인하려면 datetime
dt
순진, 체크 인 dt.tzinfo
경우, None
그때는 순진입니다 :
datetime.now()
datetime(1970, 1, 1)
순진한 날짜 시간이 있습니다. 어떻게해야합니까?
특정 상황에 따라 가정을해야합니다. 스스로에게 물어봐야 할 질문은 다음과 같습니다 datetime
. 아니면 현지 시간 이었습니까?
UTC를 사용하는 경우 (문제가 없음) :
import calendar
def dt2ts(dt):
"""Converts a datetime object to UTC timestamp
naive datetime will be considered UTC.
"""
return calendar.timegm(dt.utctimetuple())
UTC를 사용하지 않았다면 지옥에 오신 것을 환영합니다.
datetime
이전 기능을 사용하기 전에 의도 한 시간대를 되돌려 서 순진하지 않게 만들어야합니다 .
당신이 필요합니다 시간대의 이름 과 DST가 유효했던 경우에 대한 정보 대상 순진의 날짜를 (DST에 대한 마지막 정보가 cornercases 필요) 생산시를 :
import pytz
mytz = pytz.timezone('Europe/Amsterdam')
dt = mytz.normalize(mytz.localize(dt, is_dst=True))
제공하지 않은 결과is_dst
:
사용하지 is_dst
않으면 역방향 DST가 적용되는 동안 대상 날짜 시간이 생성 된 경우 (예 : 1 시간을 제거하여 DST 시간 변경) 잘못된 시간 (및 UTC 타임 스탬프)이 생성됩니다.
is_dst
물론 잘못된 것을 제공 하면 DST 겹침이나 구멍에서만 잘못된 시간 (및 UTC 타임 스탬프)이 생성됩니다. 그리고 "구멍"(전진 DST로 인해 존재하지 않았던 시간)에서 발생하는 잘못된 시간도 is_dst
제공하면이 가짜 시간을 고려하는 방법에 대한 해석을 제공 할 수 있으며, 이것이 .normalize(..)
실제로 여기서 뭔가를 수행 할 유일한 경우입니다.
그런 다음 실제 유효한 시간으로 변환합니다 (필요한 경우 datetime 및 DST 개체 변경). 주 .normalize()
당신이 특히 다른 곳에서이 변수를 다시 사용, 마지막에 정확한 UTC 타임 스탬프를 가지고 필요하지 않습니다,하지만 당신은 당신의 변수에 가짜 시간을 갖는 아이디어를 싫어하는 경우 아마 좋습니다.
및 다음의 사용을 피 (CF : pytz 날짜 시간을 사용 시간대 변환 )
dt = dt.replace(tzinfo=timezone('Europe/Amsterdam'))
왜? 때문에 .replace()
맹목적으로 대체합니다 tzinfo
계정에 목표 시간을내어과 나쁜 DST 객체를 선택합니다없이. 반면 .localize()
목표 시간과 is_dst
힌트를 사용하여 올바른 DST 개체를 선택합니다.
오래된 오답 (이 문제를 제기 한 @JFSebastien에게 감사드립니다) :
바라건대, datetime
순진한 datetime 객체 생성과 원하는 순간 사이에 변경하지 않을 시스템 구성과 관련이 있기 때문에 순진한 객체 를 만들 때 시간대 (로컬 원본)를 추측하기가 매우 쉽습니다 . UTC 타임 스탬프. 이 트릭은 불완전한 질문을 하는 데 사용할 수 있습니다 .
사용하여 time.mktime
다음을 만들 수 있습니다 utc_mktime
.
def utc_mktime(utc_tuple):
"""Returns number of seconds elapsed since epoch
Note that no timezone are taken into consideration.
utc tuple must be: (year, month, day, hour, minute, second)
"""
if len(utc_tuple) == 6:
utc_tuple += (0, 0, 0)
return time.mktime(utc_tuple) - time.mktime((1970, 1, 1, 0, 0, 0, 0, 0, 0))
def datetime_to_timestamp(dt):
"""Converts a datetime object to UTC timestamp"""
return int(utc_mktime(dt.timetuple()))
datetime
.NET Framework를 생성 한 시간대와 동일한 시간대에 개체가 생성 되었는지 확인해야 합니다 datetime
.
이 마지막 솔루션은 지금부터 UTC 오프셋이 EPOCH의 UTC 오프셋과 동일하다고 가정하기 때문에 올바르지 않습니다. 많은 시간대 (일광 절약 시간 (DST) 오프셋에 대한 연중 특정 순간)에는 해당되지 않습니다.
then.strftime('%s')
현지 시간을 예상 하지만 타임 스탬프는datetime(2008, 1, 1)
UTC로 표시됩니다.