将12小时日期/时间字符串转换为24小时日期时间
和这里其他的问题一样,我想做一个简单的时间格式转换。我找到了一些关于如何在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
现在我们已经在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 的 strftime
和 strptime
函数使用的是你电脑上相同名字的 C 函数。所以你可以查看你本地的手册,了解有哪些格式代码可以使用。想要查看一般的格式代码列表(可能会有的),可以访问 https://www.php.net/strftime。