我必须将时区感知字符串转换为python datetime对象.
例如2012-11-01T04:16:13-04:00.
我发现有一个dateutil模块具有解析函数来执行它,但我真的不想使用它,因为它添加了一个依赖项.
那我该怎么办呢?我尝试了类似下面的东西,但没有运气.
datetime.datetime.strptime("2012-11-01T04:16:13-04:00", "%Y-%m-%dT%H:%M:%S%Z")
Run Code Online (Sandbox Code Playgroud) 如何计算Python中以下时间戳的时间差(以分钟为单位)?
2010-01-01 17:31:22
2010-01-03 17:31:22
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用strptime方法将格式为"2012-07-24T23:14:29-07:00"的时间戳转换为python中的datetime对象.问题在于结束时的时间偏移(-07:00).没有偏移我可以成功做到
time_str = "2012-07-24T23:14:29"
time_obj=datetime.datetime.strptime(time_str,'%Y-%m-%dT%H:%M:%S')
Run Code Online (Sandbox Code Playgroud)
但随着我尝试的抵消
time_str = "2012-07-24T23:14:29-07:00"
time_obj=datetime.datetime.strptime(time_str,'%Y-%m-%dT%H:%M:%S-%z').
Run Code Online (Sandbox Code Playgroud)
但是它给出了一个Value错误,说"z"是一个糟糕的指令.
任何解决方案的想法?
我正在尝试从电子邮件中检索日期.起初它很容易:
message = email.parser.Parser().parse(file)
date = message['Date']
print date
Run Code Online (Sandbox Code Playgroud)
我收到:
'Mon, 16 Nov 2009 13:32:02 +0100'
Run Code Online (Sandbox Code Playgroud)
但我需要一个不错的日期时间对象,所以我使用:
datetime.strptime('Mon, 16 Nov 2009 13:32:02 +0100', '%a, %d %b %Y %H:%M:%S %Z')
Run Code Online (Sandbox Code Playgroud)
提升了ValueError, since %Z isn't format for +0100.但我在文档中找不到适当的时区格式,只有这个%Z区域.有人可以帮助我吗?
继我之前的问题,Python的时间老化之后,我现在遇到了关于时区的问题,结果发现它并不总是"+0200".因此当strptime尝试解析它时,它会引发异常.
我想过用[:-6]或者其他什么来切断+0200,但有一种真正的方法可以用strptime做到这一点吗?
如果重要的话,我正在使用Python 2.5.2.
>>> from datetime import datetime
>>> fmt = "%a, %d %b %Y %H:%M:%S +0200"
>>> datetime.strptime("Tue, 22 Jul 2008 08:17:41 +0200", fmt)
datetime.datetime(2008, 7, 22, 8, 17, 41)
>>> datetime.strptime("Tue, 22 Jul 2008 08:17:41 +0300", fmt)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/_strptime.py", line 330, in strptime
(data_string, format))
ValueError: time data did not match format: data=Tue, 22 Jul 2008 08:17:41 +0300 fmt=%a, %d %b %Y %H:%M:%S +0200
Run Code Online (Sandbox Code Playgroud) 我想把两次加在一起.ISO 8601时间戳是'1984-06-02T19:05:00.000Z',我想将其转换为秒.我尝试使用Python模块iso8601,但它只是一个解析器.
有什么建议?
我有一个表示日期的字符串文本,我完全能够解析它并将其转换为干净的日期时间对象:
date = "[24/Aug/2014:17:57:26"
dt = datetime.strptime(date, "[%d/%b/%Y:%H:%M:%S")
Run Code Online (Sandbox Code Playgroud)
除非我无法使用此处指定的%z模式捕获带有时区的整个日期字符串
date_tz = 24/Aug/2014:17:57:26 +0200
dt = datetime.strptime(date, "[%d/%b/%Y:%H:%M:%S %z]")
>>> ValueError: 'z' is a bad directive in format '[%d/%b/%Y:%H:%M:%S %z]'
Run Code Online (Sandbox Code Playgroud)
因为这个错误报告说
strftime()是按平台实现的
我确切地知道天真的tzinfo指令'%Z'没有这样的问题
通过使用dateutil模块将GST时间格式字符串转换为tzinfo对象[如此处建议] [4] ,然后将tzinfo插入datetime对象,我可以完美地做出以下解决方法
但是因为我显然需要%z模式用于进一步的项目,我想找到一个解决方案来避免这种解决方法并使用外部模块来完成这个简单的任务.你能给我一些阅读吗?我认为较新版本的python(我在2.7上)可以处理它但我现在不想改变我的版本这个小而重要的细节.
好吧,看到评论让我重新思考如何使用strptime()解析电子邮件时区指示器而不知道区域设置时间?
我有一个带有DateTimeField的模型:
deadline = models.DateTimeField(verbose_name="Valid unitl", null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)
应允许用户在现场输入日期,时间和时区信息.这是我想要的格式:
2012-12-31 23:30 +0430
Run Code Online (Sandbox Code Playgroud)
我希望在存储到db之前将时间转换为UTC.所以我尝试使用模型表单,但Enter a valid date/time.如果输入上面的值,它会在该DateTimeField上抛出验证错误.
这是在settings.py中:
DATE_INPUT_FORMATS = ('%Y-%m-%d %H:%M %Z', )
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
编辑:
根据ВидулПетров的建议,尝试使用表单字段:
deadline2 = forms.DateTimeField(input_formats=['%Y-%m-%d %H:%M %Z',],
Run Code Online (Sandbox Code Playgroud)
得到了同样的效果: Enter a valid date/time.
编辑2
看来datetime无法处理"%z"参数.这会抛出一个ValueError:
datetime.datetime.strptime(value, format)
Run Code Online (Sandbox Code Playgroud)
所以我在控制台中测试了它:
>>> import datetime
>>> datetime.datetime.strptime('2012-12-30 19:00 +0100', "%Y-%m-%d %H:%M %z")
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 317, in _strptime
(bad_directive, format))
ValueError: 'z' is a bad directive in format '%Y-%m-%d …Run Code Online (Sandbox Code Playgroud) 假设我有一个像"2009-08-18 13:52:54-04"这样的时区.我可以使用这样的一行解析大部分内容:
datetime.strptime(time_string, "%Y-%m-%d %H:%M:%S")
Run Code Online (Sandbox Code Playgroud)
但是,我无法让时区工作.有一个%Z处理文本时区("EST","UTC"等),但我没有看到任何可以解析"-04"的东西.
我确信这有一个非常简单的解决方案,但我仍然是Python的新手.
我正在尝试使用dateutil.parser.parse()来解析带有时间戳的字符串:
>>> import dateutil.parser
>>> a = dateutil.parser.parse("2011-10-01 12:00:00+01:00")
>>> print a
2011-10-01 12:00:00+01:00
Run Code Online (Sandbox Code Playgroud)
这在我的Linux服务器上工作正常,但在我的Windows测试框中它会出错:
>>> import dateutil.parser
>>> a = dateutil.parser.parse("2011-10-01 12:00:00+01:00")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 698, in parse
return DEFAULTPARSER.parse(timestr, **kwargs)
File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 302, in parse
res = self._parse(timestr, **kwargs)
File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 350, in _parse
l = _timelex.split(timestr)
File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 144, in split
return list(cls(s))
File "C:\Python27\lib\site-packages\python_dateutil-2.0-py2.7.egg\dateutil\parser.py", line 44, in __init__
instream = StringIO(instream) …Run Code Online (Sandbox Code Playgroud)