官方文档(常用日期时间模块)
资源推荐
第三方 时间模块
- arrow:更好的 Python 日期时间操作类库。官网
- Chronyk:Python 3 的类库,用于解析手写格式的时间和日期。官网
- dateutil:Python datetime 模块的扩展。官网
- delorean:解决 Python 中有关日期处理的棘手问题的库。官网
- maya:人性化的时间处理库。官网
- moment:一个用来处理时间和日期的 Python 库。灵感来自于 Moment.js。官网
- pendulum:一个比 arrow 更具有明确的,可预测的行为的时间操作库。官网
- PyTime:一个简单易用的 Python 模块,用于通过字符串来操作日期/时间。官网
- pytz:现代以及历史版本的世界时区定义。将时区数据库引入 Python。官网
- when.py:提供用户友好的函数来帮助用户进行常用的日期和时间操作。官网
14. 时间的表示
计算机中时间的表示是从 “1970 年 1月 1日 00:00:00”
开始,以毫秒(1/1000 秒) 进行计算。我们也把1970 年这个时刻成为“unix 时间点”。
这样,我们就把时间全部用数字来表示了。
python中可以通过time.time()
获得当前时刻,返回的值是以秒为单位,带微秒 (1/1000 毫秒)精度的浮点值。 例如:1530167364.8566
。
>>> import time
>>> time.time
<built-in function time>
>>> time.time()
1595651082.173596
>>> b = int(time.time()) # 取整 时间
>>> b
1530168754
>>> totalMinutes = b/60 # 除60 换为分钟
>>> totalMinutes
25502812.566666666
>>> totalMinutes = b//60 # 整除 60
>>> totalMinutes
25502812
>>> totalHours = totalMinutes//60 # 换为 小时
>>> totalHours
425046
>>> totalDays = totalHours//24 # 换为 天
>>> totalDays
17710
>>> totalYears = totalDays//365 # 换为年 距今 48 年
>>> totalYears
48
datetime模块
python-基础-时间日期处理小结(datetime模块)
import datetime
# 获取当前时间 当前日期
now = datetime.datetime.now().strftime("%Y-%m-%d") # '2020-07-25' 当前 日期
now2 = datetime.datetime.now()
# datetime.datetime(2020, 7, 25, 12, 30, 8, 968791) 当前 时间 的 datetime对象
i=3
time = datetime.date.today()+datetime.timedelta(days=i)
# datetime.date(2020, 7, 28) 加 3 天 的日期
print(now)
print(now2)
print(time)
import datetime
now = datetime.datetime.now()
print(now.hour, now.minute, now.second)
import datetime
# 获取当前时间
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# '2020-07-25 12:32:12'
print(now)
日期和时间 datetime
datetime
date
datetime
time
import datetime
最大年份
datetime.MAXYEAR
最小年份
datetime.MINYEAR
获取今日日期
today=datetime.date.today()
today
today.year # 返回今天 的 年
today.month # 返回 今天 的 月
today.day # 返回今天的日
weekday 索引 从 0 开始
isoweekeday 从1 开始。 是 常见的那种。
today.weekday()
>>> datetime.date.today().weekday()
5 # 我现在是 2020/7/25 星期六 它返回 5 因为 索引 从 0 开始 。
# 0 1 2 3 4 5 6 索引
today.isoweekday()
>>> datetime.date.today().isoweekday()
6 # 这个方法返回的就是我们常用的的 索引 从 1 开始 的
# 我现在是 2020/7/25 星期六
datetime.date
birthdate=datetime.date(2010,3,12) # 构造一个日期
birthdate.year # 看一下 日期的 年
# month
# day
# 这些属性都可以使用
datetime.time
t=datetime.time(15,46,32) # 构造一个时间
t.hour # 看一下 时
t.minute # 看一下 分
t.second # 看一下秒
datetime.datetime
now=datetime.datetime.now() # 返回现在的时间
>>> now
datetime.datetime(2020, 7, 25, 12, 39, 22, 6032)
>>> now=datetime.datetime.now()
>>> now
datetime.datetime(2020, 7, 25, 12, 39, 22, 6032)
>>> now.year # 年
2020
>>> now.second # 秒
22
>>> now.microsecond # 微秒
6032
字符串和时间 互相转换(strptime, strftime)
s='2018-3-15'
type(s)
>>> s='2018-3-15'
>>> type(s)
<class 'str'>
# 字符 转时间
t=datetime.datetime.strptime(s,'%Y-%m-%d')
t
>>> t=datetime.datetime.strptime(s,'%Y-%m-%d')
>>> t
datetime.datetime(2018, 3, 15, 0, 0)
# 时间 转 字符串
now=datetime.datetime.now() # 获取现在的时间
txt=now.strftime('%Y/%m/%d') # 时间 转字符串
txt1=now.strftime('%Y/%m/%d %H:%M:%S') # 根据需求 写 相应的格式代码
txt2=now.strftime('%Y/%m/%d %h') # 小写的 h 也是月份
print(f"""{txt}
{txt1}
{txt2}
""")
txt : 2020/07/25
txt1 : 2020/07/25 12:44:08
txt2 : 2020/07/25 Jul
datetime.timedelta
d=datetime.datetime(2018,3,5,22,44)
d
>>> d=datetime.datetime(2018,3,5,22,44) # 构造时间 日期
>>> d
datetime.datetime(2018, 3, 5, 22, 44)
birthdate=datetime.datetime(2016,5,2,19,33,44) # 构造时间 日期
birthdate
>>> birthdate=datetime.datetime(2016,5,2,19,33,44)
>>> birthdate
datetime.datetime(2016, 5, 2, 19, 33, 44)
diff=d-birthdate
diff
>>> diff=d-birthdate # 用一个日期时间 减去一个日期时间
>>> diff
datetime.timedelta(days=672, seconds=11416) # 返回的是一个 timedelta 对象
>>> diff.days # 查看天
672
>>> diff.seconds # 查看 秒
11416
>>> diff.total_seconds() # 返回 总共的秒数 。 把 天转换为秒 + 现有的秒
58072216.0
diff.days # 这个对象也可以使用 days 属性 以及 seconds 等
diff.seconds
diff.total_seconds()
# 总的时间换成 秒
在现有日期上往后推 100 天
o=datetime.datetime(2008,8,8,20,8) # 构造一个时间
o+datetime.timedelta(days=100) # 加 100 天
>>> o=datetime.datetime(2008,8,8,20,8) # 构造一个时间
>>> o+datetime.timedelta(days=100) # 加 100 天
datetime.datetime(2008, 11, 16, 20, 8)
如果 我要 往 前推 100 天呢
days = -100
就行了
d
>>> d
datetime.datetime(2018, 3, 5, 22, 44)
result=d+datetime.timedelta(days=-100) #
result
>>> result=d+datetime.timedelta(days=-100)
>>> result
datetime.datetime(2017, 11, 25, 22, 44)
给定一个时间 获取 3000 秒 以后的时间
d
>>> d
datetime.datetime(2018, 3, 5, 22, 44)
d+datetime.timedelta(seconds=3000) # 3000秒之后
>>> d+datetime.timedelta(seconds=3000) # 3000秒之后
datetime.datetime(2018, 3, 5, 23, 34)
当然 也可以把 属性换成 hours
时间 d
五小时之前的时间
d+datetime.timedelta(hours=-5)
>>> d
datetime.datetime(2018, 3, 5, 22, 44)
>>> d+datetime.timedelta(hours=-5)
datetime.datetime(2018, 3, 5, 17, 44)
批量获取文件修改时间
os.walk(top, topdown=True, onerror=None, followlinks=False)
此方法 返回一个 三元组 (产生一个3元组 (dirpath, dirnames, filenames)
.dirpath
是 你刚才输入的目录路径, dirname
此目录下的子目录名字(不包含子目录的子目录),filenames
是文件名(不包含子目录的文件)。 )
如果需要子目录的内容 请 使用 os.listdir
import os
from datetime import datetime
print(f"当前时间:{datetime:now().strftime('%Y-%m-%d %H:%M:%S')}")
def get_modify_time(indir):
for root,_,files in os.walk(indir):
# os.walk 遍历
for file in files:
# 遍历文件名
absfile=os.path.join(root,file)# 构造绝对路径
# os.path.getmtime 获取文件修改的时间
# datetime.fromtimestap 从时间戳 构建 一个datetime对象
modtime=datetime.fromtimestap(os.path.getmtime(absfile))
now=datetime.now() # 获取现在的时间
difftime=now-modtime # 现在时间 减去 修改时间
if difftiem.days<20: # 看看 过去了多少天 利用days 属性
print(f"""{absfile}修改时间[{modtime.strftime('%Y-%m-%d %H:%M:%S')}]
距今[{difftime.days:3d}天{difftime.seconds//3600:2d}时{difftime.senconds%3600//60}]""")
判断是否为闰年
import calendar
from datetime import date
mydate=date.today()
toYear=mydate.year
is_leap=calendar.isleap(toYear) # 利用 calendar 的 isleap 函数 判断 是否是闰年
print_leap_str="%s年是闰年" if is_leap else "%s年不是闰年\n"
print(print_leap_str %toYear)
calendar 模块
年的日历图
import calendar
from datetime import date
mydate=date.today()
year_calendar_str=calendar.calendar(mydate.year) # 其实 只要输入一个 年份 都可以输出的。
# calendar.calendar 输出年日历
print(f"\n{year_calendar_str}\n")
# 年 的 输出太多 就不展示了
月的日历图
import calendar
from datetime import date
mydate=date.today()
month_calendar_str=calendar.month(mydate.year,mydate.month)
# calendar.month 输出 月日历。 需要输入 参数 年 和 月
print(f"\n{month_calendar_str}")
输出:
July 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 31
月有几天(重点是 calendar.monthrange
这个函数)
import calendar
from datetime import date
print(weekday)
mydate=date.today()
weekday,days=calendar.monthrange(mydate.year,mydate.month)
# calendar.monthrange 输入参数 年 和 月
# 返回 一个元组 ( 第一天是周几,这个月有多少天) 这里是 2020 年 7月 返回(2,31)
# 这个 周几 也是 索引 0 开始的 所以 要 + 1
print(f"{mydate.year}年-{mydate.month}月的第一天是那一周的第{weekday+1}天\n")
print(f"{mydate.year}年-{mydate.month}月一共有{days}天\n")
输出:
2020年-7月的第一天是那一周的第3天
2020年-7月一共有31天
月的第一天(这个其实没啥意义。 哪个月的第一天也是 1 号)
from datetime import date
mydate=date.today()
month_first_day=date(mydate.year,mydate.month,1)
print(f"当月第一天的日期:{month_first_day}")
月的最后一天(这个看之前的一个月有多少天, 最后一天就是多少嘛)
from datetime import date
import calendar
mydate =date.today()
_,days=calendar.monthrange(mydate.year,mydate.month)
month_last_day=date(mydate.year,mydate.month,days)
print(f"当月最后一天的日期:{month_last_day}")
获取当前时间(datetime
模块 的方式和 time
模块 的方式)
from datetime import date,datetime
from time import localtime
today_date=date.today()
print(today_date)
today_time=datetime.today()
print(today_time)
#方法1
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
#方法2
local_time=time.strftime("%Y-%m-%d %H:%M:%S",localtime())
print(f"方法1:{local_time}\n方法2: {now}")
时间戳为 struct_time 对象(time 模块)
# time 模块
import time
seconds=time.time()
print("seconds",seconds)
# localtime 函数 转换 时间戳为 struct_time 对象
local_time=time.localtime(seconds)
# ctime(secs) 等于 asctime(localtime(secs))
# 也就是说 ctime 也可以 实现 时间戳 直接 转为 字符串 格式 的 时间
ctime(time.time()) # 就是获取 当前时间戳然后 转换为 时间字符
struct_time 对象 转 字符串
# asctime 将 struct_time 对象 转换为 时间字符串
time.asctime(local_time)
字符时间转时间(struct_time对象)(time 模块)
其实 和 datetime.datetime
的 strptime
函数 用法 一样
但是 要注意返回的对象
是不一样的。
datetime
返回的是 datetime.datetime
对象
from time import strptime
struct_time=strptime('2020-05-22 10:10:08', "%Y-%m-%d %H:%M:%S")
print(struct_time)
In [87]: import time
In [88]: str_to_struct=time.strptime("Tue Aug 25 18:24:44 2020","%a %
...: b %d %H:%M:%S %Y")
In [89]: str_to_struct
Out[89]: time.struct_time(tm_year=2020, tm_mon=8, tm_mday=25, tm_hour=18, tm_min=24, tm_sec=44, tm_wday=1, tm_yday=238, tm_isdst=-1)
时间转字符时间(time模块)
from time import strftime, strptime, localtime
print(localtime())#这是输入的时间
print(strftime("%m-%d-%Y %H:%M:%S", localtime())) # 转化为定制的格式
In [76]: import time
In [77]: time.time()
Out[77]: 1598351078.6242378
In [78]: time.asctime(time.localtime())
Out[78]: 'Tue Aug 25 18:24:44 2020'
In [79]: time.localtime()
Out[79]: time.struct_time(tm_year=2020, tm_mon=8, tm_mday=25, tm_hour=18, tm_min=24, tm_sec=53, tm_wday=1, tm_yday=238, tm_isdst=0)
In [80]: type(time.asctime(time.localtime()))
Out[80]: str
计算指定日期当月最后一天的日期和该月天数
有了 之前的那个 calendar.monthrange
随时可以 提取出来。
#计算指定日期当月最后一天的日期和该月天数
import datetime
import calendar
init_date = datetime.date.today()
print('当前给定时间:', init_date)
current_month_days=calendar.monthrange(init_date.year,init_date.month)[1]
print(calendar.month(2019,init_date.month))
current_month_last_day = datetime.date(init_date.year, init_date.month, current_month_days)
print("当月最后一天:",current_month_last_day)
print("该月天数:",current_month_days)
当前给定时间: 2019-12-08
December 2019
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 31
当月最后一天: 2019-12-31
该月天数: 31