我试图理解为什么在将时区转换为UTC时我得到这些结果:
In [74]: d1 = datetime(2007, 12, 5, 6, 30,tzinfo=pytz.timezone('US/Pacific'))
In [75]: d1
Out[75]: datetime.datetime(2007, 12, 5, 6, 30, tzinfo=<DstTzInfo 'US/Pacific' LMT-1 day, **16:07:00 STD**>)
In [76]: d1.astimezone(pytz.utc)
Out[76]: datetime.datetime(2007, 12, 5, 14, 23, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)
为什么早上6:30成为下午2:23?
另一方面,如果我使用以下方法,我得到预期的结果:
In [90]: d2 = datetime(2007, 12, 5, 6, 30)
In [91]: uspac = pytz.timezone('US/Pacific')
In [92]: d2_aware = uspac.localize(d2)
In [94]: d2_aware.astimezone(pytz.utc)
Out[94]: datetime.datetime(2007, 12, 5, 14, 30, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud) 我有一个表示日期的字符串文本,我完全能够解析它并将其转换为干净的日期时间对象:
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()解析电子邮件时区指示器而不知道区域设置时间?
我有一个应该在EST的时间戳:
2014-10-06T18:06:40-04:56
Run Code Online (Sandbox Code Playgroud)
我理解这第一部分:2014-10-06T18:06:40但不是-04:56.
-04:56这里的意思是什么?`
这是我得到那个时间戳的方式:
import datetime
start_time = datetime.datetime(year = 2014,
month = 10,
day = 6,
hour = 18,
tzinfo = pytz.timezone('US/Eastern'))
end_time = start_time + datetime.timedelta(seconds=400)
Run Code Online (Sandbox Code Playgroud)
然后:
end_time.isoformat()
Run Code Online (Sandbox Code Playgroud)
收益:
2014-10-06T18:06:40-04:56
Run Code Online (Sandbox Code Playgroud)