保持一种奇怪的时间格式,并在python中为其添加值

时间:2016-11-14 16:29:59

标签: python python-2.7 datetime

所以我一直在尝试在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.0​​00-07:00

l在UTC:2014-05-26T21:49:46.0​​00Z

代码说明

  • yyyy四位数年
  • MM两位数月份(01 = 1月等)
  • dd每月两位数的日期(01至31)
  • 日期/时间的分隔符
  • HH两小时的小时(00到23)(上午/下午不允许)
  • mm两位数的分钟(00到59)
  • ss秒的两位数(00到59)
  • SSS第二个
  • 的三位数毫秒
  • XXX ISO 8601时区(Z或+ hh:mm或-hh:mm)

所以,我以前尝试过的是:

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秒。

有人会这么善意帮助我吗?

1 个答案:

答案 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')从那里获取时间。然后通过字符串操作。