有关日期时间和时间的Python错误处理

时间:2015-10-14 06:01:16

标签: python

我有一个名为pubdate的变量,它来自rss feed。大部分时间它都是我想要的时间元组,所以没有错误。

有时它是一个unicode字符串,它会让人烦恼。

到目前为止,当它是一个unicode字符串时,我有以下代码pubdate

if isinstance(pubdate, unicode):
    try:
        pubdate = time.mktime(datetime.strptime(pubdate, '%d/%m/%Y %H:%M:%S').timetuple()) # turn the string into a unix timestamp
    except ValueError:
        pubdate = re.sub(r'\w+,\s*', '', pubdate) # removes day words from string, i.e 'Mon', 'Tue', etc.
        pubdate = time.mktime(datetime.strptime(pubdate, '%d %b %Y %H:%M:%S').timetuple()) # turn the string into a unix timestamp

但我的问题是,如果unicode字符串pubdate的格式与except ValueError子句中的格式不同,则会引发另一个ValueError,这是pythonic方式处理多个ValueError个案件?

2 个答案:

答案 0 :(得分:4)

当您从Rss解析日期字符串时。也许你在解析日期字符串时需要一些猜测。我建议您使用dateutil代替datetime模块。

dateutil.parser提供了一个通用日期/时间字符串解析器,它能够解析大多数已知格式以表示日期和/或时间。

此函数的原型是:parse(timestr)(您不必自己指定格式)。

<强>样本

>>> parse("2003-09-25T10:49:41")
datetime.datetime(2003, 9, 25, 10, 49, 41)

>>> parse("2003-09-25T10:49")
datetime.datetime(2003, 9, 25, 10, 49)

>>> parse("2003-09-25T10")
datetime.datetime(2003, 9, 25, 10, 0)

>>> parse("2003-09-25")
datetime.datetime(2003, 9, 25, 0, 0)

>>> parse("Sep 03", default=DEFAULT)
datetime.datetime(2003, 9, 3, 0, 0)

模糊解析:

>>> s = "Today is 25 of September of 2003, exactly " \
...     "at 10:49:41 with timezone -03:00."
>>> parse(s, fuzzy=True)
datetime.datetime(2003, 9, 25, 10, 49, 41,
              tzinfo=tzoffset(None, -10800))

答案 1 :(得分:1)

您可以采取以下方法:

jtaTransactionManagerMock.rollback()

输出为:

from datetime import datetime
import time

pub_dates = ['2/5/2013 12:23:34', 'Monday 2 Jan 2013 12:23:34', 'mon 2 Jan 2013 12:23:34', '10/14/2015 11:11', '10 2015']

for pub_date in pub_dates:
    pubdate = 0     # value if all conversion attempts fail

    for format in ['%d/%m/%Y %H:%M:%S', '%d %b %Y %H:%M:%S', '%a %d %b %Y %H:%M:%S', '%A %d %b %Y %H:%M:%S', '%m/%d/%Y %H:%M']:
        try:
            pubdate = time.mktime(datetime.strptime(pub_date, format).timetuple()) # turn the string into a unix timestamp
            break
        except ValueError as e:
            pass

    print '{:<12}  {}'.format(pubdate, pub_date)