【发布时间】:2019-02-19 08:07:57
【问题描述】:
下面的代码应该是:
- 将输入字符串解析为某种持续时间
- 验证持续时间不为空、不为负、不超过 10 年
输入字符串示例如下:
duration_string = "P10W"
duration_string = "P1Y"
这里是代码
duration = isodate.parse_duration(duration_string)
if isinstance(duration, datetime.timedelta):
if not duration > datetime.timedelta(0):
raise Exception('duration invalid')
if duration > datetime.timedelta(3660):
raise Exception('duration cannot be longer than 10 years')
elif isinstance(duration, isodate.Duration):
if not duration > 0:
raise Exception('duration invalid')
if duration > isodate.duration.Duration(0, 0, 0, years=10, months=0):
log.debug("duration %s isodate %s" % (duration, isodate.duration.Duration(0, 0, 0, years=10, months=0)))
raise Exception('duration cannot be longer than 10 years')
有没有比我制作的怪物更简单的方法?
除了需要简化之外,duration > isodate.duration.Duration(0, 0, 0, years=10, months=0) 这一行也不起作用。
我正在使用 Python 2.7
【问题讨论】:
-
30 天比一个月短还是长(想想 2 月和 8 月)?这些值之间的比较没有意义。如果你想比较时间长度,你必须先把它们变成一致的单位。
-
@FHTMitchell:这是一个很好的观点。精确性如果不是超级重要的话。我可以用 365D=12M=52W=1Y
-
OK,除非
52 weeks == 365 days然后1 week == 7.019230769230769 days。这真的是你想要的吗?你能明白为什么没有标准功能可以做到这一点吗? -
@FHTMitchell:我想不出另一种方法来将持续时间限制在合理的范围内。你能想出更好的方法吗?
-
仅在几秒钟或几天内要求输入?这个持续时间指的是什么?它是从今天开始的持续时间(因为我们将从现在开始持续 6 个月?)。有什么日期可以与此相关联吗?
标签: python python-2.7 time duration