2014-01-09 2 views
10

leapsecond timestampe datetime이 2012-06-30T23:59:60.209215 인 일부 데이터를 구문 분석하고 있습니다.Python - 윤년을 적절히 고려하지 않는 Datetime은 무엇입니까?

nofrag, frag = t.split('.') 
    nofrag_dt = datetime.datetime.strptime(nofrag, "%Y-%m-%dT%H:%M:%S") 
    dt = nofrag_dt.replace(microsecond=int(frag)) 

파이썬 문서는 %S[0, 61]을 받아으로이 문제가되지해야한다고 주장 : 그 문자열을 구문 분석하고 날짜 시간 객체로 변환 다음 코드를 사용했다. 그러나, 위의 타임 스탬프와 함께

nofrag_dt = datetime.datetime.strptime(nofrag, "%Y-%m-%dT%H:%M:%S") 
ValueError: second must be in 0..59 

감사

+3

이 내용은 해당 어디를 주장 하는가? http://docs.python.org/2/library/datetime.html "시간 모듈과 달리 datetime 모듈은 윤초를 지원하지 않습니다." – geoffspear

+0

http://docs.python.org/2/library/datetime.html#datetime.datetime.strptime은 http://docs.python.org/2/library/time.html#time.strptime을 가리키며 http는 : //docs.python.org/2/library/time.html#time.strftime 두 번째 도약 지원 주장 – madtowneast

+0

Ah. 문제는 파싱이 아닙니다. 그것은'time.strptime'에 의해 행해지고 잘 동작합니다; 문제는 초가> 59 인 경우 'datetime.datetime'으로 다시 변환 할 수 없다는 것입니다. – geoffspear

답변

1

을이 오류이 수행

import time 
import datetime 
t = '2012-06-30T23:59:60.209215' 
nofrag, frag = t.split('.') 
nofrag_dt = time.strptime(nofrag, "%Y-%m-%dT%H:%M:%S") 
ts = datetime.datetime.fromtimestamp(time.mktime(nofrag_dt)) 
dt = ts.replace(microsecond=int(frag)) 
print(dt) 

출력은 다음과 같습니다

2012-07-01 00:00:00.209215 
+0

참고 : 현지 시간을 통과하는 왕복은 (예 : DST 전환 중) 실패 할 수 있으며 [내 대답은 다음과 같이] 불필요합니다 * (http://stackoverflow.com/a/21029510/4279). – jfs

8

The documentation for %S says :

시간 모듈과 달리 datetime 모듈은 윤초를 지원하지 않습니다.

문자열 "2012-06-30T23:59:60.209215"는 시간이 UTC에 있음을 의미한다 시간은 (는 마지막 도약 순간에 두 번째) :

import time 
from calendar import timegm 
from datetime import datetime, timedelta 

time_string = '2012-06-30T23:59:60.209215' 
time_string, dot, us = time_string.partition('.') 
utc_time_tuple = time.strptime(time_string, "%Y-%m-%dT%H:%M:%S") 
dt = datetime(1970, 1, 1) + timedelta(seconds=timegm(utc_time_tuple)) 
if dot: 
    dt = dt.replace(microsecond=datetime.strptime(us, '%f').microsecond) 
print(dt) 
# -> 2012-07-01 00:00:00.209215 
+0

시간은 UTC로되어 있음을 어떻게 의미합니까? 나는'Z' 나'+00 : 00'을 볼 수 없다. –

+0

@MattJohnson : 마지막 도약 초를보세요. (전 세계에서 같은 시간입니다.) – jfs

+0

아! 아주 좋아! 너 나 거기있어! :) –