python日历自动选择当日日期(学习笔记Py的时间操作)(1)

做项目的时候,有一个简单需求,就是取到当前时间5年后的某个时间点,这个要怎么做?

这个不是简单的加5年时间,需要库里有自动识别哪一年是闰年,最后返回准确结果。

看起来简单的需求,但因为对Python类库不熟悉,可能被多个时间对象搞懵!

唯一的办法,只能把python中所有关于时间的模块全部学习一遍,以下记录学习的笔记。

通过学习,得出解决这个问题的方法:

from datetime import datetime from datetime import timedelta from calendar # 方法一、只需要将365*5就是五年的天数,但这里未考虑到闰年的情况 # 如果能判断5年中哪一些是闰年再加相应天数就可以得到正确的天数总和 dt = datetime.now() td1 = timedelta(days=365*5) # 这里的365不是固定的,不能这样写 print(dt td1) # 方法二、如果刚好碰上今年是闰年的2月29日,如果5年后又正好不是闰年,2月份没有29天,那么就会报错,所以还是要判断闰年。 d1 = date.today() print(d1.replace(year=d1.year 5)) # 方法三、可以用到calendar模块中的isleap(year)方法,这样就没问题了! dt1 = datetime.now() days = 0 for i in range(dt1.year 1,dt1.year 2): # 判断是否是闰年 if calendar.isleap(i): days = 366 else: days = 365 print(dt1 timedelta(days=days))

以下重点内容标红显示

一、背景知识介绍:

1、时间是人类规定的产物,与长度单位是一个道理,米这个单位也是人类发明的。简单说就是地球自转1圈为1天,地球饶太阳公转1圈为1年,而且根据公转自转度量时间都是不可靠的(因为非匀速无法准确度量),关键是找到匀速的度量工具。

  历史上时间计量的方法,比如:

2、为什么要知道这些背景知识?

  因为Python中出现很多关于时间的术语,比如UTC,如果一个方法返回的是UTC时间,如果不知道以上知识,就无法对返回值有预期。

二、Python 的时间类库概述:

python日历自动选择当日日期(学习笔记Py的时间操作)(2)

三、time 模块:包含时间的访问和转换功能,time模块不同于datetime中的time对象

  1、class time.struct_time:为 gmtime() 、 localtime() 和 strptime()的返回值 。它是带有 named tuple 接口的对象:可以通过索引和属性名访问值。 存在以下值:    

        

python日历自动选择当日日期(学习笔记Py的时间操作)(3)

  2、时间戳类型,形式是从 epoch 开始的秒数(浮点型 float),epoch的值可以用time.gmtime(0)查看,一般是1970年1月1日0时开始。

  3、字符串类型,形式是字符串,这里包含了时间格式转换成自定义格式字符串的各种函数。

  4、函数介绍:

python日历自动选择当日日期(学习笔记Py的时间操作)(4)

图2

四、timedelta模块:这是一个代表时间间隔的对象,可以对时间进行计算

  1、timedelta对象的标准化:timedelta会将输入的值都归结到天数上,如:timedelta(days=50,seconds=27,microseconds=10,milliseconds=29000,minutes=5,hours=8,weeks=2),将得到datetime.timedelta(days=64, seconds=29156, microseconds=10)的结果

  2、支持timedelta对象对象之间的运算:

    

python日历自动选择当日日期(学习笔记Py的时间操作)(5)

  3、支持timedelta对象之间用关系运算符计算:

>>> from datetime import timedelta >>> delta1 = timedelta(seconds=57) >>> delta2 = timedelta(hours=25, seconds=2) >>> delta2 != delta1 True >>> delta2 == 5 False ########################################## >>> delta2 > delta1 True >>> delta2 > 5 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: '>' not supported between instances of 'datetime.timedelta' and 'int'

  4、timedelta 对象还支持与 date 和 datetime 对象进行特定的相加和相减运算:这在下面的date模块中介绍。

  5、timedelta.total_seconds():返回timedelta对象所表示的时间段以秒为单位的数值。 

五、date模块:代表年、月、日的日期对象,也就是说该对象重点操作对象是年月日,忽略时分秒。两个date对象之间,或者date对象和timedalta对象之间,可以做加减运算,可以比对大、小和相等关系。

  1、函数介绍:

>>> from datetime import date >>> d = date(2002, 12, 31) >>> d.replace(day=26) datetime.date(2002, 12, 26)

  2、运算:支持与timedalta对象的运算。

  

python日历自动选择当日日期(学习笔记Py的时间操作)(6)

  3、date代码示例

# #计算距离特定事件天数的例子: >>> import time >>> from datetime import date >>> today = date.today() >>> my_birthday = date(today.year, 6, 24) >>> if my_birthday < today: # 如果生日已经过去,则创建明年的生日 ... my_birthday = my_birthday.replace(year=today.year 1) >>> my_birthday datetime.date(2008, 6, 24) >>> time_to_birthday = abs(my_birthday - today) >>> time_to_birthday.days 202 #明年生日距离今天的天数

>>> from datetime import date >>> # 输出特定格式的日期字符串,注意这里用到的缩写格式字符 >>>print('The {1} is {0:%d}, the {2} is {0:%B}.'.format(d.today(), "day", "month")) 输出:The day is 15, the month is April.

六、time对象:代表某日的(本地)时间,它独立于任何特定日期,并可通过 tzinfo 对象来调整。(tzinfo 对象涉及到时区和夏令时等概念,本文不做讨论)

  1、函数介绍:

>>> from datetime import time >>> time.fromisoformat('04:23:01') 返回:datetime.time(4, 23, 1) >>> time.fromisoformat('04:23:01.000384') 返回:datetime.time(4, 23, 1, 384) >>> time.fromisoformat('04:23:01 04:00') 返回:datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))

  2、time对象计算:time 对象支持 time 与 time 的比较,当 a 时间在 b 之前时,则认为 a 小于 b

>>>from datetime import time >>>t1 = time(1,2,4,333) >>>t2 = time(1,2,4,333) >>>if t1 == t2: >>> print("t1==t2") >>>elif t1 > t2: >>> print("t1>t2") >>>else: >>> print("t1<t2") 结果是:t1==t2

七、datetime对象:对象是包含来自 date 对象和 time 对象的所有信息的单一对象。意味这我们只需要用这个对象即可。

  1、函数介绍:

>>>d1 = datetime.today() >>>print(d1.date()) 2020-04-15 >>>print(d1.time()) 14:08:41.000856 >>>d2 = datetime.today() >>>print(d2.date()) 2020-04-15 >>>print(d2.time()) 14:08:41.000856 >>>if d2 == datetime.combine(d1.date(), d1.time(), d1.tzinfo): >>> print("这两个datetime对象相等") 结果:这两个datetime对象相等

>>> from datetime import datetime >>> datetime.fromisoformat('2011-11-04') datetime.datetime(2011, 11, 4, 0, 0) >>>datetime.fromisoformat('2011-11-04T00:05:23') datetime.datetime(2011, 11, 4, 0, 5, 23) >>> datetime.fromisoformat('2011-11-04 00:05:23.283') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000) >>> datetime.fromisoformat('2011-11-04 00:05:23.283 00:00') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc) >>> datetime.fromisoformat('2011-11-04T00:05:23 04:00') datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))

>>>datetime.strptime("2001-01-01", "%Y-%m-%d") 2001-01-01 00:00:00 >>># 等价于下面的写法,这里将time和datetime对象串联起来了 >>>print(datetime(*(time.strptime("2001-01-01", "%Y-%m-%d")[0:6]))) 2001-01-01 00:00:00

>>>d1 = datetime(2020,2,29) #2020年为闰年2月有29天 >>>print(d1) >>>print(datetime.replace(d1,year=d1.year 5)) #如果加5年也就是2025年不是闰年,则2月没有29天,会报错! 结果:ValueError: day is out of range for month

  2、datetime对象的计算

python日历自动选择当日日期(学习笔记Py的时间操作)(7)

八、calendar对象:这个模块让你可以输出日历,它还提供了其它与日历相关的实用函数。

  1、函数介绍:

import calendar cal = calendar.Calendar(firstweekday=0) for i in cal.monthdays2calendar(year=2020,month=4): print(i) 输出如下:打印了一个日历格式,X轴代表星期几 [(0, 0), (0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)] [(6, 0), (7, 1), (8, 2), (9, 3), (10, 4), (11, 5), (12, 6)] [(13, 0), (14, 1), (15, 2), (16, 3), (17, 4), (18, 5), (19, 6)] [(20, 0), (21, 1), (22, 2), (23, 3), (24, 4), (25, 5), (26, 6)] [(27, 0), (28, 1), (29, 2), (30, 3), (0, 4), (0, 5), (0, 6)]

import calendar cal = calendar.Calendar(firstweekday=0) for i in cal.monthdayscalendar(year=2020,month=4): print(i) 输出如下: [0, 0, 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, 0, 0, 0]

文章到此结束了,希望对大家有帮助,喜欢的记得关注一下小编,点赞收藏奥

下方了解更多是用Python实现人机对战

,