用于验证时间输入的Pythonic方法(仅适用于Hr,Min,Sec)

sha*_*ovo 4 python validation datetime

在我的应用程序中,我在字符串格式的变量中输入时间,例如Values = '12,12,12'.

现在我需要验证它h<24 M<60 S<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'
Run Code Online (Sandbox Code Playgroud)

但它的工作原理如下.

In [24]: datetime.time(12,12,12).strftime('%H:%M:%S')
Out[24]: '12:12:12'
Run Code Online (Sandbox Code Playgroud)

所以问题是datetime.time()将输入作为整数而'12,12,12'字符串不能在int中转换.

还有其他方法(除了regexp)只对Hr:M:S进行验证.

JBe*_*rdo 5

你必须解压缩值:

>>> values = '12,12,12'
>>> values = ast.literal_eval(values)
>>> datetime.time(*values)
datetime.time(12, 12, 12)
Run Code Online (Sandbox Code Playgroud)

如果给定的时间无效,则最后一条语句将引发错误.

为了避免零填充数字的问题,如"wim"指出的那样,可以将第二行更改为:

values = (int(i) for i in values.split(','))
Run Code Online (Sandbox Code Playgroud)

要么

values = map(int, values.split(','))
Run Code Online (Sandbox Code Playgroud)


jco*_*ado 5

请注意,对应的strftimestrptime,即,如果您需要解析一段时间,您可以使用strptime格式字符串,就像strftime使用该格式字符串打印时间一样:

>>> import time
>>> t = time.strptime('12,12,12', '%H,%M,%S')
>>> time.strftime('%H:%M:%S', t)
'12:12:12'
Run Code Online (Sandbox Code Playgroud)

这样,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
Run Code Online (Sandbox Code Playgroud)

请注意,strptime允许S<=61文档中所述:

范围真的是0到61; 这说明了闰秒和(非常罕见的)双闰秒.

如果这对您来说是个问题,那么您可能需要在代码中解析该值.