验证时间输入(仅限时、分、秒)的Pythonic方法

4 投票
2 回答
4315 浏览
提问于 2025-04-17 10:20

在我的应用程序中,我获取的时间输入是一个字符串格式的变量,比如说 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(','))

撰写回答