将12小时日期/时间字符串转换为24小时日期时间

1 投票
3 回答
8360 浏览
提问于 2025-04-16 02:36

和这里其他的问题一样,我想做一个简单的时间格式转换。我找到了一些关于如何在Perl中做到这一点的答案,但在Python中却没有。

我有一个这样的字符串:

on Jun 03, 02010 at 10:22PM

我想把它转换成一个像这样的日期时间对象:

Thu, 03 Jun 2010 22:22:00 -0000

我已经把我的输入分割成这样:

date = str(comment.div.contents[5].contents)
month = date[6:9]
day   = date[10:12]
year  = date[15:19]
time  = date[23:30]

这样我就得到了几个不错的变量,可以再放回到日期时间中。但是在这之前,我需要先转换时间。是不是应该把上面例子中的time分开,分别计算hh{AM|PM}呢?

3 个回答

1

我比较懒,所以我可能会用 strptime 和 strftime:

date = strptime(dateString, 'on %b %d, %Y at %I:%M%p')
date.strftime('%a, %d %b %H:%M:%S %z')
3

你可能更应该使用标准库,也就是time.strptime

特别是,你提到的时间可以这样转换成一个时间结构体(time.struct_time):

In [9]: time.strptime("on Jun 03, 02010 at 10:22PM", "on %b %d, 0%Y at %I:%M%p") 

Out[9]: time.struct_time(tm_year=2010, tm_mon=6, tm_mday=3, tm_hour=22, tm_min=22, tm_sec=0, tm_wday=3, tm_yday=154, tm_isdst=-1) #store in variable t

现在我们已经在t中得到了struct_time,我们可以这样做:

In [14]: time.strftime('%a, %d %b %H:%M:%S %z', t)

Out[14]: 'Thu, 03 Jun 22:22:00 '

需要注意的是,你在"Thu, 03 Jun 22:22:00 -0000"中需要的时区信息(也就是-0000那部分)在第一个格式中没有提供,所以结果中不会出现这部分。

4

使用 dateutil 库:

import datetime as dt
import dateutil.parser as dparser

date_str='on Jun 03, 02010 at 10:22PM'
date=dparser.parse(date_str)
print(date)
# 2010-06-03 22:22:00
print(date.strftime('%a, %d %b %Y %H:%M:%S'))
# Thu, 03 Jun 2010 22:22:00

如果你能把烦人的“on”去掉,并把02010改成2010,在 date_str 中,那么你可以使用 dt.datetime.strptime 来处理:

date_str='Jun 03, 2010 at 22:22PM'
date=dt.datetime.strptime(date_str,'%b %d, %Y at %H:%M%p')
print(date)
# 2010-06-03 22:22:00

或者,正如 Muhammad Alkarouri 提到的,如果 date_str 总是以 on 开头,并且年份是四位数且前面有个零,那么你可以使用:

date_str='on Jun 03, 02010 at 22:22PM'
date=dt.datetime.strptime(date_str,'on %b %d, 0%Y at %H:%M%p')
print(date)
# 2010-06-03 22:22:00

Python 的 strftimestrptime 函数使用的是你电脑上相同名字的 C 函数。所以你可以查看你本地的手册,了解有哪些格式代码可以使用。想要查看一般的格式代码列表(可能会有的),可以访问 https://www.php.net/strftime

撰写回答