gpt4 book ai didi

Python strptime `` %z``

转载 作者:行者123 更新时间:2023-11-30 22:20:33 28 4
gpt4 key购买 nike

EDIT2:这个问题假设一个带有 Python 的 POSIX-ish 平台与 Glibc 链接。

在我的系统上,使用 %z 格式化指令进行往返转换使用Python的time库无法解析ISO 8601的偏移量部分格式化时间戳。此片段:

import time
time.daylight = 0
fmt = "%Y-%m-%dT%H:%M:%SZ%z"
a=time.gmtime()
b=time.strftime(fmt, a)
c=time.strptime(b, fmt)
d=time.strftime(fmt, c)

print ("»»»»", a == c, b == d)
print ("»»»»", a.tm_zone, b)
print ("»»»»", c.tm_zone, d)

输出:

»»»» False False
»»»» GMT 2018-02-16T09:26:34Z+0000
»»»» None 2018-02-16T09:26:34Z

而预期输出是

»»»» True True
»»»» GMT 2018-02-16T09:26:34Z+0000
»»»» GMT 2018-02-16T09:26:34Z+0000

如何让 %z 遵守该偏移量?

  • Python 3.3.2 和 3.6.4
  • [Glibc 2.17 和 2.25 ⇒ 见下文!]

编辑:正如这个 C 类似物所证明的那样,Glibc 可以被宣告无罪:

#define _XOPEN_SOURCE
#define _DEFAULT_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

/* 2018-02-16T09:59:21Z+0000 */
#define ISO8601_FMT "%Y-%m-%dT%H:%M:%SZ%z"

int main () {
const time_t t0 = time (NULL);
struct tm a;
char b [27];
struct tm c;
char d [27];

(void)setenv ("TZ", "UTC", 1);
tzset ();
daylight = 0;

(void)gmtime_r (&t0, &a); /* a=time.gmtime () */
(void)strftime (b, sizeof(b), ISO8601_FMT, &a); /* b=time.strftime (fmt, a) */
(void)strptime (b, ISO8601_FMT, &c); /* c=time.strptime (b, fmt) */
(void)strftime (d, sizeof(d), ISO8601_FMT, &c); /* d=time.strftime (fmt, c) */

printf ("»»»» b ?= d %s\n", strcmp (b, d) == 0 ? "yep" : "hell, no");
printf ("»»»» %d <%s> %s\n", a.tm_isdst, a.tm_zone, b);
printf ("»»»» %d <%s> %s\n", c.tm_isdst, c.tm_zone, d);
}

哪些输出

»»»» b ?= d yep
»»»» 0 <GMT> 2018-02-16T10:28:18Z+0000
»»»» 0 <(null)> 2018-02-16T10:28:18Z+0000

最佳答案

使用“time.gmtime()”自然会获得UTC时间,因此偏移量将始终为+0000,因此输出字符串“2018-02-16T09:26:34Z”对于ISO8601来说是正确的。如果您绝对想要“+0000”,请手动添加它,因为它将始终相同:

d = time.strftime(fmt, c) + '+0000'

关于Python strptime `` %z``,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48823828/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com