2012-01-16 60 views
4

在我的應用程序中,我將時間輸入以字符串格式輸入到變量中,例如Values = '12,12,12'Pythonic驗證時間輸入的方法(僅用於Hr,Min,Sec)

現在我需要驗證它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' 

但它的工作原理如下。

In [24]: datetime.time(12,12,12).strftime('%H:%M:%S') 
Out[24]: '12:12:12' 

所以問題是,datetime.time()正在輸入作爲整數和'12,12,12'字符串不能在INT被轉換。

是否有任何其他方式(而不是正則表達式)僅對Hr:M:S進行驗證。

+0

你的意思是'M <60'和'S <60',對吧?這就是爲什麼你不應該用日期手動做任何事情的原因。它永遠不會出來 – Dave 2012-01-16 06:11:07

+1

@Dave謝謝你糾正我。 – shashaDenovo 2012-01-16 06:14:32

回答

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(',')) 
+1

@ JBernardo.Thanks !!!!它的gr8幫助:) – shashaDenovo 2012-01-16 06:17:00

+0

如果字符串輸入可能是零填充,可能會出現八進制數。否則非常優雅的字面eval和元組拆包! – wim 2012-01-16 06:21:20

+0

我會避免使用ast.literal_eval,除非您確定該值僅來自您的應用程序(而不是來自用戶)。 @jcollado的答案在下面是要走的路。 – KFunk 2014-11-23 00:30:48

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<=61documentation解釋:

範圍確實是0至61 ;這佔了閏秒和(非常罕見的)雙閏秒。

如果這對您是個問題,那麼您可能需要在代碼中解析該值。