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


209

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

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

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

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

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

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



11
숫자에 8 진 리터럴을 사용한다는 것을 알고있는 유일한 사람입니까?
Fish Monitor


3
최신 Python 3.3 이상 버전datetime.datetime.timestamp(datetime.datetime.utcnow())
MarkHu

답변:


389

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

>>> (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'

7
왜 strftime ( "% s")이 많이 나타나는지 알아 내려고 미쳤지 만 문서에는 없습니다. 아무것도 감사합니다!
Jonathan Vanasco

54
사용하지 않는 .strftime("%s"):이 지원되지 않습니다, 그것은, 그것은 자동으로 의식적 날짜 개체에 대한 잘못된 결과를 생성 할 수있다, 이식 할 수 없습니다 입력합니다 (문제로) UTC에 있지만 현지 시간대는 UTC가 아닌 경우 실패
JFS

2
@earthmeLon 브라케팅이 잘못되었습니다. 두 개의 날짜 시간을 빼서 만든 시간 델타에는 total_seconds가 있지만 날짜 시간은 없습니다.
jleahy

2
이것은 나를 위해 작동하지 않습니다 :AttributeError: 'datetime.timedelta' object has no attribute 'total_seconds'
Michael

3
@Michael이 함수는 Python 2.7의 새로운 기능이므로 이전 버전을 사용해야합니다. 2.7 이전 버전의 경우 할 수 있습니다 td.seconds + td.days*24*3600. 이것은 마이크로 초 부분을 버립니다.
jleahy

100

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

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

7
질문의 입력에 작동하는 유일한 답변이므로 +1입니다.
jfs

이거 휴대용인가요?
benjaminz

1
문제의 우려에 대한 답변이므로 올바른 답변으로 표시해야합니다. vnice kudos
레오 프린스

2
이 '작동'하지만 "UTC 시간이 있습니다"라는 질문에 유의하십시오.이 방법은 항상 시스템의 현지 시간대를 사용합니다. 시간대를 지정할 수있는 방법이 없습니다. 경우 aprilFirst이 예에서 '인식'예이었고, 시스템의 시간대에서 시간대 다른를 사용, 결과는 (시간대가 손실됩니다 정확하지 않을 것이다 timetuple()호출). awaredt.timestamp()최신 Python 3에서 사용할 수있는 '인식'날짜 시간에 대한 정답을 얻으려면 Python 2가 더 어렵습니다. 한 가지 방법은 arrow라이브러리 를 사용하는 것 입니다. arrow.get(awaredt).timestamp제대로 얻을 것입니다.
Adam Williamson

1
좋은 점은 @AdamWilliamson이지만 예제의 코드는 datetime객체를 현지화하지 않았기 때문에 "UTC로 시간이 있습니다" 는 OP에 자신이 원하는 UTC datetime간주되지 않은 객체 가 있음을 의미 한다고 가정 했습니다. 을 얻을 epoch합니다 (이 경우 datetime, 실제로이 힘 TZ-알고 있어야 변경 일을 일어난). 또한이 답변은 거의 8 년 arrow이되었고 ( 예를 들어 2013 년에 발표 된) 이후 많은 일이 일어났습니다.
BorrajaX

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

time.mktime(now.timetuple())

1
잘못 쓰는 방법입니다 time.time()( mktime()DST 전환 중에는 time.time()계속 작동 하는 동안 실패 할 수 있음 ). 그리고 현지 시간대가 UTC가 아닌 경우 질문에 대답하지 않습니다 (질문의 입력은 UTC). 입력이 현지 시간을 나타내더라도 mktime()tz 데이터베이스를 사용하지 않고 현지 시간대가 몇 년 동안 다른 utc 오프셋을 가질 수있는 경우 과거 / 미래 날짜에도 실패 할 수 있습니다 (예 : 2010-2015 년 유럽 / 모스크바)- -UTC 시간 (질문과 같이) 또는 시간대 인식 datetime 객체를 대신 사용하십시오.
jfs

바로 여기에 로컬 시간 (예에 의해 반환되는 변환 더욱 문제 .now()(의해 반환 에포크 타임 스탬프) mktime()) . 당신이 그것을 읽는다면; UTC 입력 (질문에 사용 된)이 현지 시간을 나타내는 순진한 datetime 객체보다 훨씬 선호되는 이유를 이해합니다.
jfs

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

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

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


time.mktime은 마이크로 초 부분을 고려하지 않기 때문입니다.
Eduardo Eduardo

1
옳은. C 튜트를 기반으로 한 시간 튜플 구조체에는 마이크로 초 공간이 없으므로 날짜 시간 객체에서 정보를 가져 와서 끝에 추가해야합니다.
Charles Plager


내 컴퓨터에서는 시간대가 ET 인 경우에도 올바르게 작동합니다.
Charles Plager

1
이렇게하면 시스템의 현지 시간에 따라 다른 시스템에서 다른 타임 스탬프가 제공됩니다.
Yousaf

6

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

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

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


2

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

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

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


1) 임의의 날짜 시간 개체가 아니라 지금 변환하려고한다고 가정합니다. 2) 달력이 필요하지 않습니다. time.mktime (randomDateTime.timetuple ()) + randomDateTime.microsecond * 1e-6
Charles Plager

@CharlesPlager time.mktime이 올바르지 않습니다. OP는 로컬 시간대의 인수를 해석하지만 OP는 calendar.timegm처럼 UTC로 해석 된 시간을 원합니다.
stewbasic

GMT로 시간을 변환하고 획기적인 타임 스탬프로 변환 할 때 시간을 유지하려는 경우 가장 정확한 답변입니다.
Yousaf

답을 따르면, calendar.timegm (datetime.strptime ( "2019-05-03T05 : 40 : 09.770494 + 00 : 00"[: 16], '% Y- % m- % dT % H : % M'). timetuple ()) utc에 타임 스탬프가 있으며 어떤 시스템을 실행하더라도 정확한 타임 스탬프를 제공하더라도, 트릭은 strptime.timetumple을 사용하는 것입니다.
Yousaf

2

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

import datetime
import pytz

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

출력 (부동) : 1333238400.0


stackoverflow.com/a/21145908/4355695 에서 비슷한 답변을 보았지만 하나의 라이너로 사용되는 데이터는 들어오는 데이터가 UTC이고 .timestamp ()가 현지 시간이라고 가정하는 사용 사례에 적합합니다. .
Nikhil VJ

1970 년 미만의 날짜에는 작동합니다. 감사합니다. 허용 된 답변은 1970 년 미만의 날짜에는 작동하지 않습니다. (Python 3.7.3 64 비트 Anaconda3)
canbax

-1

파이썬 3.7에서

date.isoformat () 및 datetime.isoformat ()에서 생성 된 형식 중 하나로 date_string에 해당하는 날짜 시간을 반환합니다. 특히이 함수는 YYYY-MM-DD [* HH [: MM [: SS [.fff [fff]]]] [+ HH : MM [: SS [.ffffff]]] 형식의 문자열을 지원합니다. 여기서 *는 모든 단일 문자와 일치 할 수 있습니다.

https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat


1
이것은 파이썬 3.7에서 소개되었습니다.
keithpjolley 2019
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.