关于python处理时间常用的库,分别是time、datetime、calendar这三个库,以下是整理总结的常用方法:
1、time库
# 获取本地时间戳,返回浮点数
print(time.time()) # 1590921425.7660675
# 获取结构化时间,time.gmtime(时间戳),不传参默认当前 UTC时间
print(time.gmtime()) # time.struct_time(tm_year=2020, tm_mon=5, tm_mday=31, tm_hour=10, tm_min=38, tm_sec=23, tm_wday=6, tm_yday=152, tm_isdst=0)
# time.localtime(时间戳),不传参默认当前时间
print(time.localtime()) # time.struct_time(tm_year=2020, tm_mon=5, tm_mday=31, tm_hour=18, tm_min=41, tm_sec=7, tm_wday=6, tm_yday=152, tm_isdst=0), type-->class
# 结构时间-->时间戳
print(time.mktime(time.localtime())) # 1590921819.0
# 字符串时间;time.asctime(结构化时间),不传参默认当前结构化时间
print(time.asctime()) # Sun May 31 18:44:57 2020
# time.ctime(时间戳),不传参默认当前时间戳
print(time.ctime()) # Sun May 31 18:47:23 2020
# 结构化时间-->字符串时间 time.strftime('时间格式'[,结构化时间]),不传参为默认当前时间
'''
格式化字符串 日期/时间说明 取值范围
%Y 年份 0000~9999
%m 月份(数字) 01~12
%B 月份(英文全称) January~December
%b 月份(英文缩写) Jan~Dec
%d 日期 01~31
%A 星期(英文全称) Monday~Sunday
%a 星期(英文缩写) Mon~Sun
%H 小时(24小时制) 00~23
%I 小时(12小时制) 01~12
%p 上/下午 AM,PM
%M 分钟 00~59
%S 秒 00~59
%X 本地时间表示
%w 星期(0-6),星期天为星期的开始
'''
print(time.strftime('%Y-%m-%d %H:%M:%S %A', time.localtime())) # 2020-05-31 19:10:19 Sunday
print(time.strftime('%X')) # 19:13:59
# 字符串时间-->结构化时间;time.strptime('字符串时间'[,时间格式]),字符串时间必须和时间格式对应
# 时间格式默认为 %a %b %d %H:%M:%S %Y
print(time.strptime('Thu Jun 1 10:10:10 2020')) # time.struct_time(tm_year=2020, tm_mon=6, tm_mday=1, tm_hour=10, tm_min=10, tm_sec=10, tm_wday=3, tm_yday=153, tm_isdst=-1)
print(time.strptime('2020-06-01 16:04:08', '%Y-%m-%d %H:%M:%S')) # time.struct_time(tm_year=2020, tm_mon=6, tm_mday=1, tm_hour=16, tm_min=4, tm_sec=8, tm_wday=0, tm_yday=153, tm_isdst=-1)
# 指定程序暂停时间;time.sleep(secs)
time.sleep(0.1) # 程序暂停0.1秒
2、datetime库
相比较于time库,datetime库更加直观、更易于调用。
datetime库定义了五个类,分别是:
- datetime.date: 表示日期的类
- datetime.time: 表示时间的类
- datetime.datetime: 表示日期时间的类
- datetime.timedelta:表示时间间隔,即两个时间点的间隔
- datetime.tzinfo:时区的的相关信息
from datetime import datetime
'''注意只import datetime 如此是没有.today()'''
# 返回表示今天本地时间的datetime对象
print(datetime.today()) # 2020-06-01 16:38:06.265554
print(type(datetime.today())) #
# 返回表示当前本地时间的datetime对象
print(datetime.now()) # 2020-06-01 16:41:15.314717
# 根据时间戳创建一个datetime对象
print(datetime.fromtimestamp(time.time())) # 2020-06-01 16:42:34.630726
# datetime对象操作
dt = datetime.now()
print(dt.date()) # 2020-06-01
print(dt.time()) # 16:44:01.192386
# 返回替换后的datetime对象
print(dt.replace(year=2021, month=8, day=2)) # 2021-08-02 16:47:21.978268
# 返回指定格式的datetime对象
print(dt.strftime('%Y/%m/%d %H:%M:%S')) # 2020/06/01 16:49:12
'''
datetime.timedelta
timedelta主要用来实现时间的运算
可以很方便的计算 天、分钟、秒的时间计算
'''
from datetime import timedelta
dt = datetime.now()
dt1 = dt + timedelta(days=-1) # 昨天
dt2 = dt - timedelta(days=1) # 昨天
dt3 = dt + timedelta(days=1) # 明天
dt4 = dt + timedelta(hours=10) # 10小时后
print(dt1, dt2, dt3, dt4) # 2020-05-31 16:59:58.956540 2020-05-31 16:59:58.956540 2020-06-02 16:59:58.956540 2020-06-02 02:59:58.956540
print(dt + timedelta(days=8, hours=8, minutes=20, seconds=100, milliseconds=100, microseconds=100)) # 2020-06-10 02:24:45.156418
3、calendar库
相较于前面两个库,calendar拥有更高的可视化程度
# calendar库
import calendar
# 获取指定年份的日历字符串
print(calendar.calendar(2020))
输出:2020日历
# 获取指定月份的日历字符串
print(calendar.month(2020, 6))
'''
June 2020
Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
'''
# 以列表形式返回每个月的总天数
print(calendar.mdays) # [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
# 返回指定月份的第一天是周几以及当月总天数
print(calendar.monthrange(2020, 6)) # (0, 30) (周一, 30天)
# 判断闰年
print(calendar.isleap(2020)) # True
Last、一些习题
from datetime import datetime
import calendar
import time
''' 第一题:打印出当前距离2020年9月1日有多少天多少小时多少分多少秒 '''
# 两个日期之间的差为
cha = datetime(2020, 9, 1, 16, 32) - datetime.now() # type
# 相差的天数
days = cha.days
# 相差的月数
if days > 30:
mons = days // 30 # 整除
ds = days % 30 # 取余
# print(days)
# 方法一:分割cha为列表
cha_list1 = str(cha).split()
print(cha_list1) # ['91', 'days,', '5:34:54.688354']
cha_list2 = cha_list1[2].split(':')
print("两个时间相差%d月%d天%d小时%d分钟%d秒" % (mons ,ds, int(cha_list2[0]), int(cha_list2[1]), int(cha_list2[2][:2])))
# 两个时间相差91天5小时28分钟1秒 两个时间相差3月1天5小时4分钟39秒
# 方法二:
# 相差的秒数
remain_seconds = cha.seconds
# 相差的小时数
hours = remain_seconds // 3600
# 相差的分钟数
minutes = remain_seconds % 3600 // 60
# 相差的秒数
seconds = remain_seconds % 60
print("两个时间相差%d月%d天%d小时%d分钟%d秒" % (mons ,ds, hours, minutes, seconds)) # 两个时间相差3月1天4小时41分钟35秒
''' 第二题:打印出20个月后的日期 '''
# cur = datetime.now()
def getDate(cur, ms):
year = cur.year # 当前年
month = cur.month # 当前月
day = cur.day # 当前天
# 计算20个月之后的天数
total_month = month + ms # 总的月数
y_plus = total_month // 12 # 需要增加的年数
new_month = total_month % 12 # 新的月份 0,1,2……11
# 月份为0
if new_month == 0:
y_plus -= 1
new_month = 12
# 处理2月份的情况及新的月份为30天的情况
if new_month == 2 and calendar.isleap(year + y_plus):
mdays = 29
else:
mdays = calendar.mdays[new_month]
# 如果当前天数大于新月份总天数,不外乎两种情况:1.2月 2.当前为31日,新月份总天数30日。这个时候月份加1
if mdays new_month += 1
day = day - mdays
return year+y_plus, new_month, day
cur = datetime.now()
new_date_tuple = getDate(cur, 20) # (2022, 2, 2)
# 20个月后的日期
new_date = cur.replace(new_date_tuple[0], new_date_tuple[1], new_date_tuple[2])
print(new_date) # 2022-02-02 16:55:59.228952
''' 第三题:打印出指定格式的日期 例如:2020年6月2日 星期二 17:08:32 '''
# 星期*
def getWeek(w):
if w == '1':
week = '星期一'
elif w == '2':
week = '星期二'
elif w == '3':
week = '星期三'
elif w == '4':
week = '星期四'
elif w == '5':
week = '星期五'
elif w == '6':
week = '星期六'
else:
week = '星期日'
return week
# print(type(time.strftime('%w', time.localtime()))) #
w = time.strftime('%w', time.localtime())
# print(getWeek(w))
# 输出指定格式
print(time.strftime("%Y{}%m{}%d{} {} %H:%M:%S", time.localtime()).format('年', '月', '日', getWeek(w))) # 2020年06月02日 星期二 17:31:16
''' 打印出当前距离指定日期差多少天 多少时 多少分 多少秒 '''
def cha(year, month, day):
a_datetime = datetime(year, month, day) - datetime.now()
print('当前时间距%d年%d月%d日还有%d天%d时%d分%d秒' % (year, month, day, a_datetime.days, a_datetime.seconds//3600, a_datetime.seconds % 3600//60, a_datetime.seconds%60))
cha(2020, 6, 3) # 当前时间距2020年6月3日还有0天6时11分29秒