[python] datetime을 Unix 타임 스탬프로 변환하고 파이썬으로 다시 변환하십시오.

나는 dt = datetime(2013,9,1,11)이 datetime 객체의 유닉스 타임 스탬프를 얻고 싶습니다.

내가 할 때 나는 (dt - datetime(1970,1,1)).total_seconds()타임 스탬프를 얻었다 1378033200.

를 사용하여 다시 변환 할 때 datetime.fromtimestamp얻었습니다 datetime.datetime(2013, 9, 1, 6, 0).

시간이 맞지 않습니다. 내가 여기서 무엇을 놓쳤습니까?



답변

여기서 놓친 것은 시간대입니다.

아마도 UTC 시간이 5 시간이므로 2013-09-01T11 : 00 : 00 로컬과 2013-09-01T06 : 00 : 00Z는 같은 시간입니다.

datetime시간대와 “순진한”및 “인식”개체에 대해 설명 하는 문서 상단을 읽어야 합니다.

원래 순진 날짜 시간이 UTC 인 경우이를 복구하는 방법은 utcfromtimestamp대신에 사용하는 것입니다 fromtimestamp.

반면에 원래 순진한 날짜 시간이 현지 시간 인 경우 UTC 타임 스탬프를 빼지 않아야합니다. 사용하는 datetime.fromtimestamp(0)대신.

또는 datetime 객체를 알고있는 경우 양쪽에서 로컬 인식 시간을 사용하거나 UTC와 명시 적으로 변환해야합니다.

Python 3.3 이상을 가지고 있거나 업그레이드 할 수 timestamp있는 경우 직접 수행하는 방법을 알아내는 대신 방법을 사용하여 이러한 모든 문제를 피할 수 있습니다 . 그렇지 않은 경우에도 소스 코드 대여 를 고려할 수 있습니다 .

(그리고 파이썬 3.4를 기다릴 수 있다면 PEP 341 이 최종 릴리스로 만들 것 같습니다 .JF Sebastian과 내가 말한 모든 내용은 stdlib로만 가능해야합니다. Unix와 Windows에서 동일한 방식으로 작동합니다.)


답변

해결책은

import time
import datetime
d = datetime.date(2015,1,5)

unixtime = time.mktime(d.timetuple())


답변

에포크 이후로 파이썬 날짜 시간을 초로 변환하려면 명시 적으로 수행해야합니다.

>>> import datetime
>>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
>>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0

Python 3.3 이상에서는 timestamp()대신 사용할 수 있습니다 .

>>> import datetime
>>> datetime.datetime(2012,4,1,0,0).timestamp()
1333234800.0


답변

오히려이 표현보다 POSIX 타임 스탬프를에서 만들 수 있습니다 dt,

(dt - datetime(1970,1,1)).total_seconds()

이것을 사용하십시오 :

int(dt.strftime("%s"))

두 번째 방법을 사용하여 귀하의 예에서 정답을 얻습니다.

편집 : 일부 후속 조치 … 일부 의견 (아래 참조) 후에에 대한 지원이나 문서가 부족한 것에 대해 궁금 %s했습니다 strftime. 내가 찾은 것은 다음과 같습니다.

에서 파이썬 소스 에 대한 datetimetime, 문자열이 STRFTIME_FORMAT_CODES우리에게 알려줍니다 :

"Other codes may be available on your platform.
 See documentation for the C library strftime function."

이제 우리가 man strftime(Mac OS X와 ​​같은 BSD 시스템에서) 다음을 지원합니다 %s.

"%s is replaced by the number of seconds since the Epoch, UTC (see mktime(3))."

어쨌든 %s그것이 시스템에서 작동하는 이유 입니다. 그러나 표준 시간대를 고려한 OP 문제에 대한 더 나은 솔루션이 있습니다. 여기 @abarnert의 허용 답변을 참조하십시오.


답변

UTC 시간대로 작업하는 경우 :

time_stamp = calendar.timegm(dt.timetuple())

datetime.utcfromtimestamp(time_stamp)


답변

시간대 정보를 놓쳤습니다 (이미 답변, 동의 함)

arrow패키지 는 datetimes와 함께이 고문을 피할 수 있습니다; 이미 작성, 테스트, pypi-published, cross-python (2.6 — 3.xx)입니다.

필요한 것 : pip install arrow(또는 의존성에 추가)

귀하의 경우를위한 솔루션

dt = datetime(2013,9,1,11)
arrow.get(dt).timestamp
# >>> 1378033200

bc = arrow.get(1378033200).datetime
print(bc)
# >>> datetime.datetime(2013, 9, 1, 11, 0, tzinfo=tzutc())
print(bc.isoformat())
# >>> '2013-09-01T11:00:00+00:00'


답변

datetime 객체가 UTC 시간을 나타내는 경우 튜플이 현지 시간대에 있다고 가정하므로 time.mktime을 사용하지 마십시오. 대신 calendar.timegm을 사용하십시오.

>>> import datetime, calendar
>>> d = datetime.datetime(1970, 1, 1, 0, 1, 0)
>>> calendar.timegm(d.timetuple())
60