所以我一直在尝试在python中为我的REST调用添加时间格式,但似乎总是有某种类型的问题,首先这里是时间格式要求,它必须是精确的,或者它不幸的是不会工作。
在请求参数中使用以下符合ISO-8601标准的日期/时间格式。
YYYY-MM-dd'T'HH:MM:ss.SSSXXX
例如,2014年5月26日21:49:46 PM可能会有如下格式之一的格式:
l在PDT:2014-05-26T21:49:46.000-07:00
l在UTC:2014-05-26T21:49:46.000Z
代码说明
所以,我以前尝试过的是:
def format_time(self, isnow):
currentdt = datetime.datetime.utcnow()
if not isnow:
currentdt += datetime.timedelta(0,3)
(dt, micro) = currentdt.strftime('%Y-%m-%dT%H:%M:%S.%f').split('.')
dt = "%s.%03dZ" % (dt, int(micro) / 1000)
return dt
现在,这可能会以正确的格式返回,但时区仍然存在问题。
我想要完成的最终结果是,当我执行此操作时,它会找到当前时间(阿姆斯特丹时区/ GMT / UTC + 1),并以此格式创建它。 和else语句,以获得相同的时间,但附加X秒。
有人会这么善意帮助我吗?
答案 0 :(得分:1)
好的,所以你把微秒格式化为毫秒,那里做得很好。
现在你的挑战是处理时区偏移;它不仅可以是Z。
为了使事情变得更加困难,strftime的%z
格式会给出+(或 - )HHMM,而不是HH:MM。
所以你需要处理这个问题。这是一种方法:
Python 3:
def format_time(self, isnow):
currentdt = datetime.datetime.now(datetime.timezone.utc)
if not isnow:
currentdt += datetime.timedelta(0,3)
(dt, micro) = currentdt.strftime('%Y-%m-%dT%H:%M:%S.%f').split('.')
tz_offset = currentdt.astimezone().strftime('%z')
tz_offset = "Z" if tz_offset == "" else tz_offset[:3] + ":" + tz_offset[3:]
dt = "%s.%03d%s" % (dt, int(micro) / 1000, tz_offset)
return dt
Python 2:
import pytz
from dateutil.tz import *
def format_time(self, isnow):
currentdt = datetime.datetime.now(pytz.utc)
if not isnow:
currentdt += datetime.timedelta(0,3)
(dt, micro) = currentdt.strftime('%Y-%m-%dT%H:%M:%S.%f').split('.')
tz_offset = currentdt.astimezone(tzlocal()).strftime('%z')
tz_offset = "Z" if tz_offset == "" else tz_offset[:3] + ":" + tz_offset[3:]
dt = "%s.%03d%s" % (dt, int(micro) / 1000, tz_offset)
return dt
对评论的回应: 我需要做一些改变。找到当前时区是非常重要的。我能找到的最简单方法是https://stackoverflow.com/a/25887393/1404311,我已将这些概念整合到现在的代码中。
基本上,您应该使用utcnow()
而不是now(datetime.timezone.utc)
。前者给出了一个天真的日期时间,而后者给出了一个设置为UTC的日期时间,但是知道它是。然后使用astimezone()
让其了解您当地的时区,然后使用strftime('%z')
从那里获取时间。然后通过字符串操作。