接上文 Python内置时间模块:Datetime实例详解(一)https://developer.aliyun.com/article/1618146?
1.3 时间转换
时间的三种存在方式:时间对象,时间字符串,时间戳。
时间对象,比如date、datetime、time对象等;时间字符串,如:"2022-03-20";时间戳,如time.time()返回的就是时间戳。
在数据处理过程中,经常会遇到需要将不同形式的时间进行转换。下面介绍常用的方法:
1.3.1 时间对象转字符串
时间对象转换成字符串,可以通过isoformat或strftime方法来实现。
strftime的英文全称str format time,根据给定的格式将时间对象转换为字符串
import datetime
# 将date时间对象转为字符串
d1 = datetime.date(2022, 0o03, 20)
print(f'转换字符串之前的类型为:{type(d1)}\n')
print(f'转为的字符串日期为:{d1}\n类型为{type(d1.isoformat())}\n')
转换字符串之前的类型为:<class 'datetime.date'>
转为的字符串日期为:2022-03-20 类型为<class 'str'>
# 用strftime来转换
# YYYY-MM-DD 形式
d2 = d1.strftime('%Y-%m-%d')
2022-03-20
# MM DD, YYYY形式
d2 = d1.strftime('%b %d, %Y')
print(d2)
Mar 20, 2022
# 将time 时间对象转换为字符串
t1 = datetime.time(16, 59, 30)
t2 = t1.strftime('%H:%M:%S')
print(t2)
16:59:30
# 将datetime时间对象转为字符串
dt2 = datetime.datetime.now()
dt3 = dt2.strftime('%Y-%m-%d %H:%M:%S')
print('\n'+f'现在日期和时间的字符串形式为:{dt3}')
现在日期和时间的字符串形式为:2022-03-21 20:04:56
dt4 = dt2.isoformat()
print(dt4)
2022-03-21T20:04:56.818553
Python中常见的时间日期格式化符号:
1.3.2 字符串转时间对象
字符串转时间对象,用的是strptime方法,与strftime方法刚相反。
strptime的英文全称是str parse time,将字符串解析为给定相应的时间对象。
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :3/21/22 10:38 AM
# 文件 :字符串转时间对象.py
# IDE :PyCharm
import datetime
s1 = '2022-03-21'
d = datetime.datetime.strptime(s1, '%Y-%m-%d')
print(d)
2022-03-21 00:00:00
下面提供了strftime方法与strptime方法的比较:
需要注意的是,strftime方法可供date,time和datetime对象使用,而strptime方法仅供datetime对象使用。
1.3.3 时间戳转换时间对象
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :3/21/22 12:06 PM
# 文件 :时间戳转换为时间对象.py
# IDE :PyCharm
import datetime
import time
# 获取当前的时间戳
ts_1 = time.time()
print(f'今天的时间戳为:{ts_1}')
今天的时间戳为:1647866330.826814
# 获取当天00:00:00的时间戳
ts_2 = int(time.time()/86400)*86400
print(f'今天00:00:00的时间戳{ts_2}')
今天00:00:00的时间戳1647820800
获取当天23:59:59的时间戳
一天有246060 = 86400
ts_3 = int(time.time()/86400)*86400+86400-1
print(f'今天23:59:59的时间戳:{ts_3}')
今天23:59:59的时间戳:1647907199
# 将时间戳转换为时间对象
print(f'当前时间的时间戳转为时间对象为:{datetime.datetime.fromtimestamp(ts_1)}')
当前时间的时间戳转为时间对象为:2022-03-21 20:38:50.826814
# 将时间戳转换为时间对象
print(f'当前时间戳转为当前日期对象:{datetime.date.fromtimestamp(ts_1)}')
print(datetime.date(2022, 0o03, 21))
当前时间戳转为当前日期对象:2022-03-21
2022-03-21
1.3.4 将时间对象转为时间戳
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
因此,将时间对象转换为时间戳时,直接计算两个时间对象的timedelta,并将timedelta以"秒"来表示就可以了。
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :3/21/22 4:05 PM
# 文件 :将时间对象转为时间戳.py
# IDE :PyCharm
import datetime
dt1 = datetime.datetime(2022, 0o03, 21, 16, 0o12, 1) # 0o12八进制代表十进制数10
# 注意这里要用北京时间
dt_s = datetime.datetime(1970, 1, 1, 8, 0)
timedelta_1 = dt1 - dt_s
# 返回时间间隔包含了多少秒
timedelta_s = timedelta_1.total_seconds()
print(f'返回时间间隔了{timedelta_s}秒')
print(f'时间间隔了{int(timedelta_s/86400/365)}年!')
返回时间间隔了1647850201.0秒
时间间隔了52年!
这里我们来反推一下,看我们将时间对象转换为时间戳,是否正确
将时间戳转为时间对象
print(datetime.datetime.fromtimestamp(timedelta_s))
print(datetime.datetime(2022, 0o03, 21, 16, 37, 1))
2022-03-21 16:10:01
2022-03-21 16:37:01
1.4 时间对象的运算
1.4.1 获取当天最小时间和最大时间
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :3/21/22 4:40 PM
# 文件 :获取当天最小时间和最大时间.py
# IDE :PyCharm
# 获取当天最小时间
import datetime
# datetime.time.min 当天的最小时间就是00:00:00
# datetime.date.today()取当天日期
min_time= datetime.datetime.combine(datetime.date.today(), datetime.time.min)
print(f'当天最小时间为:{min_time}')
当天最小时间为:2022-03-21 00:00:00
# 获取当天最大时间
max_time = datetime.datetime.combine(datetime.date.today(), datetime.time.max)
print(f'当天最大时间为:{max_time}')
当天最大时间为:2022-03-21 23:59:59.999999
1.4.2 获取当前日期的前几天/后几天
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :3/21/22 5:21 PM
# 文件 :9.4.2获取当前日期的前几天后几天.py
# IDE :PyCharm
import datetime
# 获取明天
tomorrow = datetime.date.today() + datetime.timedelta(days=1)
today = datetime.date.today()
print(f'今天是:{today}---明天是:{tomorrow}')
今天是:2022-03-21---明天是:2022-03-22
after_days = int(input('请输入今天之后的天数:'))
after_day = datetime.date.today() + datetime.timedelta(days=after_days)
print(f'{after_days}天之后的今天是{after_day}')
请输入今天之后的天数:3
3天之后的今天是2022-03-24
获取前天
the_day_before_yesterday = datetime.date.today() - datetime.timedelta(days=2)
print(f'\n今天是:{today}--前天是{the_day_before_yesterday}')
今天是:2022-03-21--前天是2022-03-19
1.4.3 获取本周或本月第一天及最后一天
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :3/21/22 5:33 PM
# 文件 :获取本周或本月第一天及最后一天.py
# IDE :PyChar
# 今天日期
d_today = datetime.date.today()
print(f'今天是{d_today}')
# 获取本周的第一天
the_first_day_of_this_week = d_today - datetime.timedelta(d_today.weekday())
print(f'本周第一天是:{d_today}')
今天是2022-03-21
本周第一天是:2022-03-21
# 获取本周最后一天
the_last_day_of_this_week = d_today + datetime.timedelta(6-d_today.weekday())
print(f'本周最后一天是:{the_last_day_of_this_week}')
本周最后一天是:2022-03-27
1.4.4 计算两个日期相差多少天
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :3/21/22 6:07 PM
# 文件 :9.4.4计算两个日期相差多少天.py
# IDE :PyCharm
import datetime
# timedelta 对象的计算
dt2 = datetime.datetime.today()
dt1 = datetime.datetime(2021,0o03,21,18,12,10)
td1 = dt2 - dt1
n = int(input(f'请输入一个数字:'))
new_year = datetime.date.today().year - n
dt1 = datetime.datetime(new_year,dt2.month, dt2.day, dt2.hour, dt2.minute, dt2.second)
td1 = dt2 - dt1
print(f'{n}年前的今天,我们的。已经一起走过{td1}')
请输入一个数字:1
1年前的今天,我们相遇。你我已经一起走过365 days, 0:00:00.480073
请注意:如果需要计算两个日期之间总共相差多少秒,应该用total_seconds()方法
td = datetime.timedelta(days=2, seconds=68539, microseconds=403113)
print(td.days, td.total_seconds())
2 241339.403113
```