验证时间输入(仅限时、分、秒)的Pythonic方法
在我的应用程序中,我获取的时间输入是一个字符串格式的变量,比如说 Values = '12,12,12'
。
现在我需要验证这个输入,确保小时小于24,分钟和秒都小于60,格式是 '%H:%M:%S'
。
为此,我尝试使用 datetime.time().
我最开始是用 values = '12'
来试,然后又用 '12,12,12'
。
In [1]: import datetime
In [2]: values = '12'
In [3]: d = datetime.time(values)
TypeError Traceback (most recent call last)
/mypc/test/<ipython console> in <module>()
TypeError: an integer is required
In [4]: d = datetime.time(int(values))
In [5]: d
Out[5]: datetime.time(12, 0)
In [6]: d.strftime('%H:%M:%S')
Out[6]: '12:00:00'
In [7]: s = d.strftime('%H:%M:%S')
In [8]: s
Out[8]: '12:00:00'
In [9]: values = '12,12,12'
In [10]: d = datetime.time(int(values))
ValueError: invalid literal for int() with base 10: '12,12,12'
但是它的工作结果是这样的。
In [24]: datetime.time(12,12,12).strftime('%H:%M:%S')
Out[24]: '12:12:12'
所以问题在于,datetime.time() 只接受整数作为输入,而 '12,12,12'
这个字符串无法转换成整数。
有没有其他方法(除了正则表达式)来验证这个小时、分钟和秒的格式呢?
2 个回答
5
请注意,strftime
的对应函数是strptime
。也就是说,如果你需要解析一个时间,可以使用strptime
,方法和使用strftime
打印时间时用格式字符串的方式是一样的:
>>> import time
>>> t = time.strptime('12,12,12', '%H,%M,%S')
>>> time.strftime('%H:%M:%S', t)
'12:12:12'
这样一来,strptime
就会负责验证时间的正确性(比如H<24, M<60, S<=61
):
>>> time.strptime('24,0,0', '%H,%M,%S')
...
ValueError: time data '24,0,0' does not match format '%H,%M,%S'
>>> time.strptime('0,60,0', '%H,%M,%S')
...
ValueError: time data '0,60,0' does not match format '%H,%M,%S'
>>> time.strptime('0,0,62', '%H,%M,%S')
...
ValueError: unconverted data remains: 2
要注意的是,strptime
允许S<=61
,具体解释可以参考文档:
这个范围实际上是0到61;这是为了考虑闰秒和(非常少见的)双闰秒。
如果这对你来说是个问题,那么你可能需要在代码中解析这个值。
5
你需要把这些值拆开:
>>> values = '12,12,12'
>>> values = ast.literal_eval(values)
>>> datetime.time(*values)
datetime.time(12, 12, 12)
如果给定的时间不合法,这最后一句话会报错。
为了避免出现带零的数字问题,正如“wim”提到的,可以把第二行改成:
values = (int(i) for i in values.split(','))
或者
values = map(int, values.split(','))