14_时间的表示_日期操作_时间操作_time_datetime

官方文档(常用日期时间模块)

datetime

time

calendar

时间格式字符串-例如: %Y-%m-%d 代表年月日

Python3 日期和时间 w3c教程

Python 计算每个月天数

资源推荐

第三方 时间模块

  • 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月的第一天是那一周的第32020-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.datetimestrptime 函数 用法 一样

但是 要注意返回的对象 是不一样的。

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

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值