http里的时间格式

本文重点讲解GMT时间格式,UTC时间以及如何用python对他们进行换换,http里的日期都采用GMT时间格式。UTC被称之为世界标准时间, 比我们所用的北京时间慢8个小时,GMT是格林威治标准时间, 理论上UTC比GMT时间更加准确。

1. GMT时间格式

我们中国人喜欢用的时间格式是下面的样式

2020-04-06 21:27:45

GMT时间格式是符合英语国家的人的习惯,http里的日期时间都采用GMT时间格式,我们随便打开一个网页,通过谷歌浏览器的开发者工具查看Response headers的Date首部,就可以看到类似下面的时间格式

Date: Mon, 06 Apr 2020 13:20:09 GMT

在http里,允许你使用下面三种时间格式的任意一种

Mon, 06 Apr 2020 13:20:09 GMT   # RFC 822, updated by RFC 1123
Monday, 06-Apr-20 13:20:09 GMT  # RFC 850, obsoleted by RFC 1036
Mon Apr  6 13:20:09 2020   # ANSI C's asctime() format

2. 当前UTC时间与GMT时间互相转换

当你想生成一个GMT时间时,必须从UTC时间开始进行转换,前两种GMT格式,可以很容易通过strptime方法进行转换

from datetime import datetime

# 当前utc转成GMT时间格式
format_1 = '%a, %d %b %Y %H:%M:%S GMT'
format_2 = '%A, %d-%b-%y %H:%M:%S GMT'
utc_now = datetime.utcnow()
gmt_1 = utc_now.strftime(format_1)
gmt_2 = utc_now.strftime(format_2)

print(gmt_1)
print(gmt_2)

# GMT时间格式转成utc
utc_1 = datetime.strptime(gmt_1, format_1)
utc_2 = datetime.strptime(gmt_2, format_2)
print(utc_1)
print(utc_2)

程序输出结果

Mon, 06 Apr 2020 14:08:52 GMT
Monday, 06-Apr-20 14:08:52 GMT
2020-04-06 14:08:52
2020-04-06 14:08:52

我一直在说UTC时间,这里希望你能把我们所使用的北京时间暂时忘记,因为在http的时间里,使用的时间一定是比我们所用的北京时间慢8个小时,当你处理与http相关的时间时,一定要切记,用utc时间来理解问题和解决问题。

2. 处理ANSI c 的asctime 时间格式

Mon Apr  6 13:20:09 2020

这是第三种可以在http里使用的时间格式,我们可以直接从datetime.utcnow()进行转换,稍麻烦之处在于无法直接使用strftime方法,因为处理日的时间时,小于10的日总是以0开头进行表示,比如3月1日,总是表示成03-01, 这与GMT时间格式不符,但可以使用自定义的字符串格式化方法来解决这个问题

from datetime import datetime

utc_now = datetime.utcnow()
date_str = utc_now.strftime("%a %b") + \
           "  {day}".format(day=utc_now.day) + \
           utc_now.strftime(' %H:%M:%S %Y')


print(date_str)

如果使用time模块,方法更为简单

import time

print(time.asctime(time.gmtime()))

两份程序的输出结果相同,都是

Mon Apr  6 14:17:40 2020

如果想把这种格式的字符串转成datetime类型,却可以使用strptime方法

print(datetime.strptime('Mon Apr  6 14:17:40 2020', '%a %b  %d %H:%M:%S %Y'))

%d 可以将日期6转换为对应的datetime类型中的day, 但是反过来,从datetime数据类型触发,使用%d不能将日期06转换为6。

如果你习惯使用time模块来处理时间,那么也可以将这种格式的时间字符串转成struct_time

print(time.strptime('Mon Apr  6 14:17:40 2020', '%a %b  %d %H:%M:%S %Y'))

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案