[python] strftime을 사용하여 Python datetime을 epoch로 변환

에포크 이후 초 수를 원하는 UTC 시간이 있습니다.

strftime을 사용하여 초 수로 변환하고 있습니다. 2012 년 4 월 1 일을 예로 들어 보겠습니다.

>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'

epoch의 UTC는 1333238400이지만 1 시간마다 다른 1333234800을 반환합니다.

따라서 strftime이 시스템 시간을 고려하여 시간대 이동을 어딘가에 적용하는 것처럼 보입니다. 나는 날짜 시간이 순전히 순진하다고 생각 했습니까?

그 문제를 어떻게 해결할 수 있습니까? 가능한 경우 표준이 아닌 경우 다른 라이브러리를 가져 오지 마십시오. (이동성 문제가 있습니다).



답변

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

>>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0

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

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

왜 사용하지 않아야 하는가 datetime.strftime('%s')

파이썬은 실제로 % s를 strftime의 인수로 지원하지 않습니다 ( http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior 에서 확인 하면 목록에 없음) 그것이 작동하는 이유는 파이썬이 현지 시간대를 사용하는 시스템의 strftime에 정보를 전달하기 때문입니다.

>>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'


답변

시간대 등에 심각한 문제가있었습니다. 파이썬이 혼란스러워하는 모든 것을 처리하는 방식은 나에게 혼란 스럽습니다. 캘린더 모듈을 사용하면 문제가없는 것 같습니다 (링크 참조). 1 , 2 , 34 참조 ).

>>> import datetime
>>> import calendar
>>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0)
>>> calendar.timegm(aprilFirst.timetuple())
1333238400


답변

import time
from datetime import datetime
now = datetime.now()

time.mktime(now.timetuple())


답변

import time
from datetime import datetime
now = datetime.now()

# same as above except keeps microseconds
time.mktime(now.timetuple()) + now.microsecond * 1e-6

(죄송합니다, 기존 답변에 대해서는 언급하지 않습니다)


답변

유닉스 / 에포크 시간으로 타임 스탬프가 필요하면이 한 줄이 작동합니다.

created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L

datetime
python2 및 python3의 작품 에만 의존합니다.


답변

이것은 Python 2와 3에서 작동합니다.

>>> import time
>>> import calendar
>>> calendar.timegm(time.gmtime())
1504917998

공식 문서를 따르면 …
https://docs.python.org/2/library/time.html#module-time


답변

명시 적 시간대 독립적 솔루션의 경우 pytz 라이브러리를 사용하십시오.

import datetime
import pytz

pytz.utc.localize(datetime.datetime(2012,4,1,0,0), is_dst=False).timestamp()

출력 (부동) : 1333238400.0