2016-01-08 35 views
3

我使用以下(不完整的代碼,只是相關的位)轉換日期字符串:捕捉/天「的時間數據不匹配格式」

str_format = '%Y-%m-%d %H:%M:%S' 
datetime.strptime('2015-13-23 13:43:23', str_format) 

這將引發「時間數據與格式不匹配「,因爲月份錯了(13月份不是有效月份)。

我想知道是否有可能在月份(或日期)發生異常時發生異常而不是由於日期無效而導致格式不匹配?下面清楚地表明,日期時間可以確定:

>>> print datetime(2015, 13, 23) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: month must be in 1..12 
+0

最常見的方式取得錯誤是交換月份和日期,因爲美國和歐洲的習俗是相反的,所以誤差是有道理的。 –

+0

你爲什麼在第13個月過世? – NotAnAmbiTurner

+0

不知道這是否是正確的方式,但可能是你可以引發異常和異常阻止 –

回答

1

你總是可以分析文本,然後用它來構建一個日期時間你自己 - 或者預先驗證它是否適合你:

from datetime import datetime 

def to_datetime(date_string): 
    year = int(date_string[0:4]) 
    month = int(date_string[5:7]) 
    day = int(date_string[8:10]) 

    return datetime(year, month, day) 

print(to_datetime('2015-13-23 13:42:13')) 

拋出:

Traceback (most recent call last): 
    File "test.py", line 11, in <module> 
    print(to_datetime('2015-13-23 13:42:13')) 
    File "test.py", line 9, in to_datetime 
    return datetime(year, month, day) 
ValueError: month must be in 1..12 

如果你想知道如何datetime它 - 使用源,盧克!

>>> import datetime 
>>> datetime.__file__ 
'/usr/lib/python3.5/datetime.py' 

打開該文件,你會發現:

def _check_date_fields(year, month, day): 
    year = _check_int_field(year) 
    month = _check_int_field(month) 
    day = _check_int_field(day) 
    if not MINYEAR <= year <= MAXYEAR: 
     raise ValueError('year must be in %d..%d' % (MINYEAR, MAXYEAR), year) 
    if not 1 <= month <= 12: 
     raise ValueError('month must be in 1..12', month) 
    dim = _days_in_month(year, month) 
    if not 1 <= day <= dim: 
     raise ValueError('day must be in 1..%d' % dim, day) 
    return year, month, day 
+0

應該一天的片段是'date_string [8:10]'? – NotAnAmbiTurner

+1

@NotAnAmbiTurner啊,你是對的。顯然'int'無視尾部空格,儘管:) –

+0

@WayneWerner:這是(一點)比我預期的更多的工作,但這當然包括它!我試圖查找日期時間。py文件,但[顯然](http://stackoverflow.com/a/269825/4739755)我必須去取一個tar包才能在Windows上找到它: -/ –

0

我覺得有兩種方法可以解決這個:

路1

str_format = '%Y-%m-%d %H:%M:%S' 

try: 
    datetime.strptime('2015-13-23 13:43:23', str_format) 
except ValueError: 
    raise ValueError("Something went wrong") 

這樣做的缺點是,它的不限於只有月份或日期錯誤的情況,因爲您的問題最初被問到。

路2

import calendar 

str_format = '%Y-%m-%d %H:%M:%S' 
datetime_str = '2015-13-23 13:43:23' 
year = int(datetime_str[0:4]) 
month = int(datetime_str[5:7]) 
day = int(datetime_str[8:10]) 
cal = calendar.Calendar(6) 

if not 1 <= month <= 12: 
    raise ValueError("wrong month") 
else: 
    days_list = list(cal.itermonthdays(year, month)) 
    if day not in days_list: 
     raise ValueError("invalid day") 

如果你想使用的發電機無需轉換到一個列表

.... 

if not 1 <= month <= 12: 
    raise ValueError("wrong month") 

days_gen = cal.itermonthdays(year, month) 

for gen_day in days_gen: 
    if gen_day == day: 
     break 
else: 
    raise ValueError("wrong day") 
+2

更好地指定'例外類型'而不是觀察所有例外情況 –

相關問題