2011-01-06 6 views
2

Stackoverflow에서 같은 줄에 몇 가지 질문이 있지만이 경우는 다릅니다.Python : 절대 날짜 스탬프로 절대 날짜 문자열 변환

입력으로 세 가지 일반 형식을 사용할 수있는 날짜 문자열이 있습니다. 어느

A) 2011년 1월 6일 b)는 3 일 전 18 시간 전

C) 내가 스크립트 형식을 인식하고 매개 변수를 사용하여 적절한 함수를 호출 할 수 있어야합니다.

그래서 만약 다음 convert_full_string ("2011년 1월 6일")

경우 나 다음 convert_days (4)

경우 C convert_hours 나는 형식과 수를 인식하면 (12)

적절한 함수를 호출하기는 비교적 쉽습니다. 사용을 계획하고 있습니다. dateutil

그러나 형식을 인식하는 방법을 모르겠습니다.

코드 샘플을 제안 해 주시면 감사하겠습니다.

감사합니다.

답변

12

, 당신은 논리를 직접 코딩 할 필요없이 datetime.datetime 객체로 세 날짜 형식을 구문 분석 할 수 :

import parsedatetime.parsedatetime as pdt 
import parsedatetime.parsedatetime_consts as pdc 
import datetime 
c = pdc.Constants() 
p = pdt.Calendar(c) 
for text in ('january 6, 2011', '4 days ago', '12 hours ago'): 
    date=datetime.datetime(*p.parse(text)[0][:6]) 
    # print(date.isoformat()) 
    # 2011-01-06T09:00:18 
    # 2011-01-02T09:00:18 
    # 2011-01-05T21:00:18 
    print(date.strftime('%Y%m%dT%H%M%S')) 
    # 20110106T090208 
    # 20110102T090208 
    # 20110105T210208 
+0

와플은 물건을 아주 단순하게 해줍니다! 심지어 도서관에 대해서도 몰랐다. 원시 datetime 객체를 가져올 수 있습니다. 궁극적으로, 나는 다음과 같은 형식으로 날짜 시간을 갖고 싶다 : 20110106T083630 –

+0

@Al Jepo : 위의 편집 된 게시물에서, date는'datetime.datetime' 객체이다. 이것이 원시 datetime 객체의 의미입니까? 'date'는 원하는 결과에 가까운 isoformat 메쏘드를 가지고 있습니다. 그렇지 않으면'strftime' 메쏘드를 사용하여 정확하게 얻을 수 있습니다. – unutbu

+0

고마워요. 너 락! 명확하게 잘 33.9K 포인트를받을 자격이! –

0

당신은 정규 표현식과 일치시킬 수 있습니다 :

[0-9]{1,2}일 전에 유사
import re 
re.search(r".* [0-9]{1,2}, [0-9]{4}", tomatch) 

0
if 'days' in userinput: 
    convert_days(userinput[:userinput.index('days')].strip()) 
elif 'hours' in userinput: 
    convert_hours(userinput[:userinput.index('hours')].strip()) 
else: 
    convert_full_string(userinput) 

이 있다고 가정합니다 "일"또는 "시간은"UserInput 사용자에 포함되어있는 경우, 항상 그 두 단어 앞에 오는 문자들을 원합니다. parsedatetime 사용

+0

큰 가정 : 나는 혼자 몇 시간을 보낼 수있을 때까지 "나는 일을 믿는다 내 아내 " – bgporter

+1

글쎄, OP 작성 : '입력으로, 나는 세 가지 일반적인 형식을 취할 수있는 날짜 문자열을 가지고 ...'시 또는 일기 항목 정도의 언급이 없습니다. – XORcist