2019-05-25 整理并精简,归纳出几种常用日期时间处理方法。
2019-12-16 优化一些表述,更易于理解,方便实际过程中直接使用。
以下基本我在日常写代码中,最常用的一些日期相关部分。
strftime()
无论是time
或datetime
,哪个模块都可以,具体怎么输出,自行调整格式参数'%Y-%m-%d %H:%M:%S'
%字符 | 表意 | 数值范围 |
---|---|---|
%y | 年(2位) | 00, 01, …, 99 |
%Y | 年(4位) | 0001, 0002, …, 2013, 2014, …, 9998, 9999 |
%m | 月 | 01, 02, …, 12 |
%d | 日 | 01, 02, …, 31 |
%H | 时(24小时制) | 00, 01, …, 23 |
%M | 分 | 00, 01, …, 59 |
%S | 秒 | 00, 01, …, 59 |
更多符号含义,参看官方文档:
strftime | url |
---|---|
datetime | https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes |
time | https://docs.python.org/3/library/time.html#time.strftime |
【注意】:
time、datetime两种时间模块虽然都有strftime
,但是(格式,时间)
参数位置正好相反。
另外datetime的转义符号更全面,比如%f
微秒,只有datetime有,time没有这个符号
time模块(格式在前,时间在后)
import time
t = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
print(type(t),t)
# 输出结果
<class 'str'> 2019-05-25 08:56:45
datetime模块(格式在后,时间在前)
import datetime
dt = datetime.datetime.strftime(datetime.datetime.now(),'%Y-%m-%d %H:%M:%S.%f')
print(type(dt),dt)
# 输出结果
<class 'str'> 2019-05-25 08:56:45.405471
strptime("日期时间文本","文本格式")
制定时间格式,进行解析
import datetime
dt = datetime.datetime.strptime('2019-05-25T07:46:45.743+0000','%Y-%m-%dT%H:%M:%S.%f%z')
print(type(dt),dt)
# 输出结果
<class 'datetime.datetime'> 2019-05-25 07:46:45.743000+00:00
parse("日期时间文本")
自动解析
from dateutil.parser import parse
dt = parse('2019-05-25 07:46:45')
print(type(dt),dt)
# 输出结果
<class 'datetime.datetime'> 2019-05-25 07:46:45
该方法适用于很多类型时间格式,建议使用前自行测试
dt = ["2001.07.04 AD at 12:08:56 PDT",
"Wed, 4 Jul 2001 12:08:56 -0700",
"190525",
"2018-08-06T10:00:00.000Z",
"Wed, Jul 4",
"12:08 PM",
"02001.July.04 AD 12:08 PM",
"20190525083855-0700",
"2001-07-04T12:08:56.235-0700",
"Thu Oct 16 07:13:48 GMT 2014"]
for i in dt:
print(parse(i))
# 输出结果
2001-07-04 12:08:56
2001-07-04 12:08:56-07:00
2025-05-19 00:00:00
2018-08-06 10:00:00+00:00
2019-07-04 00:00:00
2019-05-25 12:08:00
2001-07-04 12:08:00
2019-05-25 08:38:55-07:00
2001-07-04 12:08:56.235000-07:00
2014-10-16 07:13:48+00:00
但是注意,国外日期时间的常用格式和国内不一样。单写19-05-25
会被解析成2025年5月19日
print(parse("19-05-25"))
# 输出结果
2025-05-19 00:00:00
如果是2019-05-25
就不会错了
print(parse("2019-05-25"))
# 输出结果
2019-05-25 00:00:00
生成10或13位时间戳(做一些网页爬虫或构造提交时候可能用到)
import time
t = time.time()
print(type(t),t)
print('10位时间戳:',str(int(t)))
print('13位时间戳:',str(int(t*1000)))
# 输出结果
<class 'float'> 1558750679.0872486
10位时间戳: 1558750679
13位时间戳: 1558750679087
时间戳转日期时间(10位或13位通用)
import datetime
ts = '1517302458364' # 该时间戳为int,float,string均可
dt1 = datetime.datetime.fromtimestamp(int((str(ts).strip().replace(".",""))[:10]))
print(type(dt1),dt1)
# 输出结果
<class 'datetime.datetime'> 2018-01-30 16:54:18.364000
时间戳转时间文本(10位或13位通用)
import time
ts = '1517302458364' # 该时间戳为int,float,string均可
dt1 = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(int((str(ts).strip().replace(".",""))[:10])))
print(type(dt1),dt1)
# 输出结果
<class 'str'> 2018-01-30 16:54:18
如果是两个datatime
格式的日期,直接计算一下差值即可
import datetime
dt1 = datetime.datetime.fromtimestamp(1517302458)
dt2 = datetime.datetime.now()
#print(type(dt1),dt1)
#print(type(dt2),dt2)
td = dt2-dt1
#print(type(td),td)
output = '相差%d天%.1f小时'%(td.days,td.seconds/60/60)
print(output)
# 输出结果
<class 'datetime.datetime'> 2018-01-30 16:54:18
<class 'datetime.datetime'> 2019-12-16 16:18:37.443000
<class 'datetime.timedelta'> 684 days, 23:24:19.443000
相差684天23.4小时
如果是两个文本格式的日期,用parse()
转换成datetime
,同样计算差值即可
import datetime
from dateutil.parser import parse
dt1 = '2018-01-30 16:54:18'
dt2 = '2019-12-16 16:18:37'
td = parse(dt2)-parse(dt1)
print('相差%d天%.1f小时'%(td.days,td.seconds/60/60))
# 输出结果
相差684天23.4小时
直接获取0时区的datetime
,并转化为东8区datetime
。
from datetime import datetime,timezone,timedelta
dt0 = datetime.utcnow().replace(tzinfo=timezone.utc)
dt8 = dt0.astimezone(timezone(timedelta(hours=8))) # 转换时区到东八区
print('UTC协调世界时 \t%s\nUTC+8北京时间\t%s'%(dt0,dt8))
# 输出结果
UTC协调世界时 2019-05-25 02:48:54.281741+00:00
UTC+8北京时间 2019-05-25 10:48:54.281741+08:00
如果是想将文本格式的2019-05-25T02:48:54.281741+00:00
转化到东8区datetime
from datetime import datetime,timezone,timedelta
from dateutil.parser import parse
dt0_str = '2019-05-25T02:48:54.281741+00:00'
dt0 = parse(dt0_str)
dt8 = dt0.astimezone(timezone(timedelta(hours=8)))
print(type(dt0),dt0)
print(type(dt8),dt8)
# 输出结果
<class 'datetime.datetime'> 2019-05-25 02:48:54.281741+00:00
<class 'datetime.datetime'> 2019-05-25 10:48:54.281741+08:00