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

Keeping a strange time format, and adding values to it in python

所以我一直在尝试在python中为我的REST调用添加一个时间格式,但似乎总是有一些问题,首先是时间格式要求,必须是精确的,否则很不幸它不会工作。

在请求参数中使用以下符合ISO-8601的日期/时间格式。

年-月-日-日'hh:mm:ss.sssxx

例如,2014年5月26日下午21:49:46的格式如下:

PDT中的L:2014-05-26t21:49:46.000-07:00

l表示UTC:2014-05-26t21:49:46.000z

代码说明

  • YYYY四位数年份
  • mm两位数月份(01=1月等)
  • 月日两位数(01到31)
  • 日期/时间的T分隔符
  • hh小时的两位数(00到23)(不允许AM/PM)
  • mm分钟的两位数(00到59)
  • ss秒的两位数(00到59)
  • sss秒的三位数毫秒
  • XXX ISO 8601时区(Z或+hh:mm或-hh:mm)

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

1
2
3
4
5
6
7
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秒。

有人能帮我吗?


好的,微秒的格式是毫秒,很好。

现在您的挑战是处理时区偏移;它不能只是z。

为了让事情变得更困难,strftime的%z格式给出了+(或-)hh mm,而不是hh:mm。

所以你需要解决这个问题。有一种方法可以做到:

Python 3:

1
2
3
4
5
6
7
8
9
10
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
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,我已经将这些概念集成到上面的代码中。

基本上,您应该使用now(datetime.timezone.utc),而不是utcnow()。前者给出了一个幼稚的日期时间,而后者给出了一个设置为UTC的日期时间,但要知道它是这样的。然后使用astimezone()让它知道您的本地时区,然后使用strftime('%z')从那里获取时区。然后进行字符串操作。