time.struct_time 객체를 datetime 객체로 어떻게 변환합니까?


288

파이썬 time.struct_time객체를 객체로 어떻게 변환 datetime.datetime합니까?

첫 번째 라이브러리를 제공하는 라이브러리와 두 번째 라이브러리를 원하는 두 번째 라이브러리가 있습니다.

답변:


384

time.mktime () 을 사용 하여 Epoch 이후 시간 튜플 (localtime)을 초로 변환 한 다음 datetime.fromtimestamp () 를 사용 하여 datetime 오브젝트를 가져 오십시오.

from datetime import datetime
from time import mktime

dt = datetime.fromtimestamp(mktime(struct))

45
현대인들은이 한계를 결코 기억하지 않습니다!
mlissner

3
tm_isdst데이터가 손실 됩니까? 나는 날짜 객체를 결과로 반환 할 정도로 순진 남아있다, 그렇게 생각 None.dst()경우에도 struct.tm_isdst입니다 1.
n611x007

3
이것은 일반적으로 작동합니다. 그러나 시간 튜플이 mktime이 허용하는 값 ​​(예 : 값 (1970, 1, 1, 0, 0, 0, 0, 1, -1))을 초과하면 실패합니다. 이 튜플을 반환하는 HTTP 요청에서 Date 헤더를 구문 분석 한 후이 문제가 발생했습니다.
user3820547

3
@richvdh : C 표준 은 CPython에서 C 함수를 호출 하고 Python에서 C 함수를 호출 mktime()하도록 지정합니다 . 이 모호 할 때 잘못 현지 시간을 선택합니다 (예를 들어, -의 - DST 종료시 ( "후퇴") 전환)하는 경우 수도 인 경우, 또는 주어진 플랫폼은 무시 입력 . 또한 로컬 시간대가 과거에 다른 utc 오프셋을 가지고 있고 C 가 이전 utc 오프셋 값을 제공 할 수있는 히스토리 tz 데이터베이스를 사용하지 않는 경우 잘못된 (예 : 1 시간) 값도 리턴 할 수 있습니다. tm_isdsttime.mktime()mktime()mktime()struct.tm_isdst-1mktime() tm_isdstmktime()mktime()
jfs

1
@naxa : 주어진 플랫폼에서 mktime()무시하지 않으면 tm_isdst(내 것입니다) fromtimestamp()정보 를 확실히 잃어 버립니다 : 현지 시간을 나타내는 반환 된 순진 datetime 객체가 모호 할 수 있습니다 (타임 스탬프-> 현지 시간이 결정적입니다 (윤초를 무시하면) local time -> timestamp may be ambiguous e.g., during end-of-DST transition). Also, fromtimestamp ()`는 역사적 tz 데이터베이스를 사용하지 않는 경우 잘못된 utc 오프셋을 선택할 수 있습니다.
jfs

123

이처럼 :

>>> structTime = time.localtime()
>>> datetime.datetime(*structTime[:6])
datetime.datetime(2009, 11, 8, 20, 32, 35)

3
# import를 시간에 잊지 말고, 날짜
jhwist

7
@ jhwist-사람들이 스스로 알아낼 수있는 것들 :)
orip

14
@rodling the *and **syntax를 사용하면 listy 또는 dicty type 객체를 확장하여 인수를 분리 할 수 ​​있습니다. 자세한 내용은 docs.python.org/2/tutorial/… 을 참조하십시오
OrganicPanda

10
struct_time에 윤초가있는 경우 ValueError가 발생한다는 것을 기억하십시오. 예 :t=time.strptime("30 Jun 1997 22:59:60", "%d %b %Y %H:%M:%S"); datetime.datetime(*t[:6])
berdario

7
@berdario : 호환되는 값을 반환합니다 datetime. datetime(*t[:5]+(min(t[5], 59),))예 : accept "2015-06-30 16:59:60 PDT".
jfs

37

이것은 귀하의 질문에 대한 직접적인 대답이 아닙니다 (이미 잘 답변되었습니다). 그러나 몇 번이나 기본 사항에 대해 물린 적이 있었으므로 다른 time 필드가 가질 수있는 것과 비교하여 time.struct_time 객체가 제공하는 내용을 면밀히 검토해야 할만큼 스트레스를 줄 수 없습니다.

time.struct_time 객체와 다른 날짜 / 시간 문자열이 모두 있다고 가정하면 두 가지를 비교하고 달리 할 수있는 경우 데이터가 손실되지 않고 순진한 datetime 객체를 실수로 만들지 않는지 확인하십시오.

예를 들어, 우수한 feedparser 모듈은 "published"필드를 리턴하고 "published_parsed"필드에 time.struct_time 오브젝트를 리턴 할 수 있습니다.

time.struct_time(tm_year=2013, tm_mon=9, tm_mday=9, tm_hour=23, tm_min=57, tm_sec=42, tm_wday=0, tm_yday=252, tm_isdst=0)

이제 "게시 된"필드를 통해 실제로 얻을 수있는 것에 주목하십시오.

Mon, 09 Sep 2013 19:57:42 -0400

으로 스톨만 의 수염! 시간대 정보!

이 경우 게으른 사람은 훌륭한 dateutil 모듈을 사용하여 시간대 정보를 유지할 수 있습니다.

from dateutil import parser
dt = parser.parse(entry["published"])
print "published", entry["published"])
print "dt", dt
print "utcoffset", dt.utcoffset()
print "tzinfo", dt.tzinfo
print "dst", dt.dst()

그것은 우리에게 :

published Mon, 09 Sep 2013 19:57:42 -0400
dt 2013-09-09 19:57:42-04:00
utcoffset -1 day, 20:00:00
tzinfo tzoffset(None, -14400)
dst 0:00:00

그런 다음 시간대 인식 날짜 시간 객체를 사용하여 모든 시간을 UTC 또는 정상이라고 생각하는 모든 것을 정규화 할 수 있습니다.


7
*_parsedfeedparsed의 모든 필드 는 날짜 구문 분석 문서 에서 확인할 수 있으므로 UTC로 이미 정규화되어 있으므로 중복됩니다.
itorres

1
@ itorres : 이해하면이 대답은 UTC로 정규화하는 것이 아니라 원시 문자열 날짜를 구문 분석 datetime할 때 손실 되는 객체에 시간대 정보를 유지하는 것 feedparser입니다.
davidag
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.