-1

time.strptime 和 datetime.strptime 都以 24 小时制给出结果,即使我在时间格式字符串中指定了 12 小时制。我使用了它,我注意到它不尊重我的 PM 符号(将 9PM 存储为 9AM),即使时间格式设置正确。

例子:

format = "%I:00PM"
mytime = "09:00PM"
x = time.strptime(mytime, format)
print x

输出

time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=9, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1)

这是错误的!在这种情况下,tm_hour 是 9,它应该是 21。

如果我尝试

y = datetime.strptime(mytime,format)
print y

我明白了

1900-01-01 09:00:00

又是大错特错。

时间段应该是 21(晚上 9 点),而不是上午 9 点。

4

2 回答 2

2

没有理由通过字符串进行转换,几乎可以肯定会导致问题。

让我们试试这个:

tm = time.struct_time(tm_year=2013, tm_mon=4, tm_mday=4, tm_hour=15, tm_min=52, tm_sec=25, tm_wday=3, tm_yday=94, tm_isdst=1)
dt = datetime.datetime(tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec)

但是您可能会注意到,我们使用 的前 6 个成员的struct_time顺序与它们在该结构中出现的顺序相同。并且struct_time实际上是一个namedtuple或某物,其行为就像一个。所以真的,只是:

dt = datetime.datetime(*tm[:6])

如果你想要一个timeobject 而不是 a datetime,那很容易。这些中的任何一个:

t = datetime.time(tm.tm_hour, tm.tm_min, tm.tm_sec)
t = datetime.datetime(*tm[:6]).time()

同时,如果您不知道天真日期和有意识日期之间的区别,请阅读datetime文档介绍。Astruct_time永远是幼稚的,而datetime你以这种方式构造的也会是幼稚的。您必须在外部跟踪它是本地时间、UTC 时间还是来自其他时区的本地时间。如果你把它混在一起,你会遇到一些问题,比如认为它是 1:00 而实际上是 10:00,反之亦然。

于 2013-04-04T22:55:07.320 回答
1

我不知道这是否是做你想做的最好的方法,但你可以使用格式

import time
mytime = "09:00PM"
time.strptime(mytime, '%I:00%p')
time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=21, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1)

%p格式化而不是'PM'字符串

于 2013-04-04T22:52:44.797 回答