2013-12-12 53 views
0

即時通訊使用以下工作原理將UTC字符串轉換爲日期時間 - 除非毫秒數大於6位數。比它吹。 urgh * &^* &python strptime從UTC字符串到datetime正則表達式re.sub

format = '%Y-%m-%dT%H:%M:%S' 
if '.' in value: 
    format = format + '.%f' 
if value.endswith('Z'): 
    format = format + 'Z'   
return datetime.strptime(value, format) 

這裏是堆棧跟蹤

File "/usr/lib64/python2.6/_strptime.py", line 325, in _strptime 
    (data_string, format)) 
ValueError: time data '2013-07-19T13:02:53.8241899Z' does not match format '%Y-%m-%dT%H:%M:%S.%fZ' 

最新的方法,以限制毫秒到的長度爲6個數字。使用'{:%Y-%m-%dT%H:%M:%S.6%f}'.format( datetime),但它有助於隨機數/

所以嘗試使用re.sub()來限制所提供字符串中'.'character後面的小數(如果有)。但我不是非常正確的。

即時通訊在機器上使用python 2.6。*。

+0

你真的需要有6位數字的毫秒? :O – aIKid

+0

如果代碼本身包含'sz'和'value'的值,則此示例代碼片段可能會更好。 –

+1

生成正確的字符串,你可以使用'datetime.utcnow()。isoformat()+'Z''。它看起來像['rfc3339'](http://tools.ietf.org/search/rfc3339#section-5.6)不限制小數點後的位數。所以如果輸入字符串以'Z'結尾,那麼在你的情況下它是一個有效的rfc3339日期。 – jfs

回答

1

你可以使用.partition()方法來解析字符串:如果你想使用re.sub

from datetime import datetime 

sz = '2013-07-19T13:02:53.8241899Z' # utc time in rfc3339 format (without offset) 

sz = sz.rstrip('Z') # remove ending 'Z' if present 
timestr, _, digits = sz.partition('.') 
utc_dt = datetime.strptime(timestr, '%Y-%m-%dT%H:%M:%S') 
if digits: 
    microseconds = int(digits, 10) * 10**(6 - len(digits)) 
    utc_dt = utc_dt.replace(microsecond=int(microseconds + .5)) 

,不介意截斷微秒:

import re 
from datetime import datetime 

sz = '2013-07-19T13:02:53.8241899Z' 
if '.' in sz: 
    sz = re.sub(r'(\.\d{,6})\d*Z?$', r'\1Z', sz) # truncate to 6 digits +Z 
else: # no fractions 
    sz = sz.rstrip('Z') + '.0Z' 

utc_dt = datetime.strptime(sz, '%Y-%m-%dT%H:%M:%S.%fZ') 
+0

thnx。如果re.sub方法證明太慢,生病會給你一個鏡頭。問候。 –

+0

@GabeRainbow:我添加了're.sub'代碼。 – jfs

+0

正義的塞巴斯蒂安。超好 –

3

聽起來像dateutil的工作。

$ pip install python-dateutil 
$ python 
>>> import dateutil.parser 
>>> d = dateutil.parser.parse('2013-07-19T13:02:53.8241899Z') 
>>> print d 
2013-07-19 13:02:53.824189+00:00 
+1

'dateutil'會截短微秒,而不是四捨五入。無論如何,將它用於以「Z」結尾的rfc3339格式是一種矯枉過正。 [簡單''.partition('。')'會工作](http://stackoverflow.com/a/20534752/4279) – jfs

+0

thnx。截斷是好的。可能會在更長的時間內給它一個鏡頭。問候。 –

1

如果你想用re.sub來做,下面是一個簡單的例子。

import re 
from datetime import datetime 

value = '2013-07-19T13:02:53.8241899Z' 

regex = r"(\d{6,}\d+)" 

if re.search(regex, value): 
    repl = lambda x: x.group(0)[:6] 
    value = re.sub(pattern=regex, repl=repl, string=value) 

format = '%Y-%m-%dT%H:%M:%S' 
if '.' in value: 
    format = format + '.%f' 
if value.endswith('Z'): 
    format = format + 'Z'   
print datetime.strptime(value, format)