大家好,马上就要过年了,大家是不是都快回家了。
前段时间才哥主要在忙于工作和游戏,以及准备肥家事宜(比如预约核酸)。
终于,回家之后准备好好学习一下,从python基础模块开始,今天为大家准备的是python的日期与时间处理模块time
和datetime
。
目录:
1. time模块
1.1. 常见方法
1.2. struct_time对象的属性
1.3. 补充
2. datetime模块
2.1. timedelta类
2.2. datetime类
2.3. date类
2.4. time类
1. time模块
import time
1.1. 常见方法
## 获取当前时间的时间戳[以秒为单位]
now = time.time()
now
1612787759.8878834
## 将时间戳转化为0时区struct_time对象
time.gmtime(now)
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=8, tm_hour=12, tm_min=35, tm_sec=59, tm_wday=0, tm_yday=39, tm_isdst=0)
## 将时间戳转化为本地时区struct_time对象
time.localtime(now)
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=8, tm_hour=20, tm_min=35, tm_sec=59, tm_wday=0, tm_yday=39, tm_isdst=0)
## 将时间戳转化为日期时间字符串
time.ctime(now)
'Mon Feb 8 20:35:59 2021'
## 将struct_time对象转化为日期时间字符串[本地时区]
time.asctime(time.localtime(now))
'Mon Feb 8 20:35:59 2021'
## 将struct_time对象转化为日期时间字符串[0时区]
time.asctime(time.gmtime(now))
'Mon Feb 8 12:35:59 2021'
## 将struct_time对象转化为时间戳[本地时区]
time.mktime(time.localtime(now))
1612787759.0
## 将struct_time对象转化为时间戳[0时区]
time.mktime(time.gmtime(now))
1612758959.0
## 返回性能计数器的值(以小数秒为单位)作为浮点数,即具有最高可用分辨率的时钟,以测量短持续时间
## 一般两次一起用才有意义(比如算程序运行时间)
time.perf_counter()
795.6651928
## 举例
t0 = time.perf_counter()
time.sleep(3)
t1 = time.perf_counter()
t1 - t0
3.0004672000000028
## 返回当前进程的系统和用户CPU时间总和的值(以小数秒为单位)作为浮点数
## 一般两次一起用才有意义(比如算程序运行时间,不过它不包括sleep()休眠时间期间经过的时间)
time.process_time()
5.421875
## 举例
t0 = time.process_time()
time.sleep(3)
t1 = time.process_time()
t1 - t0
0.0
## 休眠s秒,如休眠5秒
time.sleep(5)
## 将struct_time对象转化为日期格式字符串
time.strftime?
strftime(format[, tuple]) -> string
Convert a time tuple to a string according to a format specification.
See the library reference manual for formatting codes. When the time tuple
is not present, current time as returned by localtime() is used.
Commonly used format codes:
%Y Year with century as a decimal number.
%m Month as a decimal number [01,12].
%d Day of the month as a decimal number [01,31].
%H Hour (24-hour clock) as a decimal number [00,23].
%M Minute as a decimal number [00,59].
%S Second as a decimal number [00,61].
%z Time zone offset from UTC.
%a Locale's abbreviated weekday name.
%A Locale's full weekday name.
%b Locale's abbreviated month name.
%B Locale's full month name.
%c Locale's appropriate date and time representation.
%I Hour (12-hour clock) as a decimal number [01,12].
%p Locale's equivalent of either AM or PM.
Other codes may be available on your platform. See documentation for
the C library strftime function.
time.strftime('%Y %m %d',time.localtime(now))
'2021 02 08'
time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(now))
'2021-02-08 20:35:59'
## 默认情况下是将当前时间转化为格式化日期时间格式
time.strftime('%Y-%m-%d %H:%M:%S')
'2021-02-08 20:57:33'
## 将字符串格式的日期时间转化为struct_time对象
time.strptime?
strptime(string, format) -> struct_time
Parse a string to a time tuple according to a format specification.
See the library reference manual for formatting codes (same as
strftime()).
Commonly used format codes:
%Y Year with century as a decimal number.
%m Month as a decimal number [01,12].
%d Day of the month as a decimal number [01,31].
%H Hour (24-hour clock) as a decimal number [00,23].
%M Minute as a decimal number [00,59].
%S Second as a decimal number [00,61].
%z Time zone offset from UTC.
%a Locale's abbreviated weekday name.
%A Locale's full weekday name.
%b Locale's abbreviated month name.
%B Locale's full month name.
%c Locale's appropriate date and time representation.
%I Hour (12-hour clock) as a decimal number [01,12].
%p Locale's equivalent of either AM or PM.
Other codes may be available on your platform. See documentation for
the C library strftime function.
## 使用的时候参数1为格式化字符串,参数2为具体格式format,需要match上,否则会报错
time.strptime(time.strftime('%Y-%m-%d %H:%M:%S'),'%Y-%m-%d %H:%M:%S')
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=8, tm_hour=21, tm_min=2, tm_sec=15, tm_wday=0, tm_yday=39, tm_isdst=-1)
1.2. struct_time对象的属性
我们在使用time的各种方法时发现,很多方法是基于struct_time对象的,这个对象有如下属性
tm_year=2021, ##年
tm_mon=2, ##月
tm_mday=8, ##日
tm_hour=21, ##小时
tm_min=2, ##分钟
tm_sec=15, ##秒
tm_wday=0, ##周内日,0为周一,以此类推
tm_yday=39, ##年内日
tm_isdst=-1 ##夏时令,取值为0,1,-1(0为非夏时令,1为夏时令,-1为不确定)
1.3. 补充
在python3.7之后,新增支持更高精度ns
time.time_ns()
1612790399292476900
time.perf_counter_ns()
2941758666100
time.process_time_ns()
6593750000
2. datetime模块
datetime模块包含timedelta
、datetime
、date
和time
等常用的类
2.1. timedelta类
timedelta 对象表示两个 date 或者 time 的时间间隔
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
所有参数都是可选的并且默认为 0。这些参数可以是整数或者浮点数,也可以是正数或者负数。
只有 days, seconds 和 microseconds 会存储在内部。参数单位的换算规则如下:
1毫秒会转换成1000微秒。
1分钟会转换成60秒。
1小时会转换成3600秒。
1星期会转换成7天。
并且 days, seconds, microseconds 会经标准化处理以保证表达方式的唯一性,即:
0 <= microseconds < 1000000
0 <= seconds < 3600*24 (一天的秒数)
-999999999 <= days <= 999999999
from datetime import timedelta
类属性
## 最小的间隔
timedelta.min
datetime.timedelta(days=-999999999)
## 最大的间隔
timedelta.max
datetime.timedelta(days=999999999, seconds=86399, microseconds=999999)
## 两个不相等的 timedelta 类对象最小的间隔
timedelta.resolution
datetime.timedelta(microseconds=1)
实例属性
delta = timedelta(days=50,seconds=27,microseconds=10)
print(delta)
50 days, 0:00:27.000010
## 间隔天数
delta.days
50
## 间隔秒数
delta.seconds
27
## 间隔微秒数
delta.microseconds
10
实例方法
## 返回时间间隔包含了多少秒
delta.total_seconds()
4320027.00001
支持的运算:
运算 | 结果 |
---|---|
t1 = t2 + t3 | t2 和 t3 的和。运算后 t1-t2 == t3 and t1-t3 == t2 必为真值。(1) |
t1 = t2 - t3 | t2 减 t3 的差。运算后 t1 == t2 - t3 and t2 == t1 + t3 必为真值。(1)(6) |
t1 = t2 * i or t1 = i * t2 | 乘以一个整数。运算后假如 i != 0 则 t1 // i == t2 必为真值。 |
t1 = t2 * f or t1 = f * t2 | 乘以一个浮点数,结果会被舍入到 timedelta 最接近的整数倍。精度使用四舍五偶入奇不入规则。 |
f = t2 / t3 | 总时间 t2 除以间隔单位 t3 (3)。返回一个 float 对象。 |
t1 = t2 / f or t1 = t2 / i | 除以一个浮点数或整数。结果会被舍入到 timedelta 最接近的整数倍。精度使用四舍五偶入奇不入规则。 |
t1 = t2 // i or t1 = t2 // t3 | 计算底数,其余部分(如果有)将被丢弃。在第二种情况下,将返回整数。(3) |
t1 = t2 % t3 | 余数为一个 timedelta 对象。(3) |
q, r = divmod(t1, t2) | 通过 : q = t1 // t2 (3) and r = t1 % t2 计算出商和余数。q是一个整数,r是一个 timedelta 对象。 |
+t1 | 返回一个相同数值的 timedelta 对象。 |
-t1 | 等价于 timedelta (-t1.days, -t1.seconds, -t1.microseconds), 和 t1* -1. (1)(4) |
abs(t) | 当 t.days >= 0``时等于 +\ *t*, 当 ``t.days < 0 时 -t 。(2) |
str(t) | 返回一个形如 [D day[s], ][H]H:MM:SS[.UUUUUU] 的字符串,当 t 为负数的时候, D 也为负数。(5) |
repr(t) | 返回一个 timedelta 对象的字符串表示形式,作为附带正规属性值的构造器调用。 |
注释:
结果正确,但可能会溢出。
结果正确,不会溢出。
除以0将会抛出异常
ZeroDivisionError
。-timedelta.max 不是一个
timedelta
类对象。timedelta
对象的字符串表示形式类似于其内部表示形式被规范化。对于负时间增量,这会导致一些不寻常的结果。例如:>>> timedelta(hours=-5)
datetime.timedelta(days=-1, seconds=68400)
>>> print(_)
-1 day, 19:00:00表达式
t2 - t3
通常与t2 + (-t3)
是等价的,除非 t3 等于timedelta.max
; 在这种情况下前者会返回结果,而后者则会溢出。
2.2. datetime类
datetime 对象是包含来自 date 对象和 time 对象的所有信息的单一对象。
与 date 对象一样,datetime 假定当前的Gregorian向前后两个方向无限延伸;与 time 对象一样,datetime 假定每一天恰好有 3600*24 秒。
class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
year, month 和 day 参数是必须的。tzinfo 可以是 None 或者是一个 tzinfo 子类的实例。其余的参数必须是在下面范围内的整数:
MINYEAR <= year <= MAXYEAR,
1 <= month <= 12,
1 <= day <= 指定年月的天数,
0 <= hour < 24,
0 <= minute < 60,
0 <= second < 60,
0 <= microsecond < 1000000,
fold in [0, 1].
如果参数不在这些范围内,则抛出 ValueError 异常。
from datetime import datetime
## 返回本地时区的当前日期时间
datetime.today()
datetime.datetime(2021, 2, 8, 22, 38, 20, 550529)
## 获取本地时区当前日期时间
datetime.now()
datetime.datetime(2021, 2, 8, 22, 38, 20, 880645)
## 获取当前utc日期时间
datetime.utcnow()
datetime.datetime(2021, 2, 8, 13, 16, 23, 118320)
## 返回时间戳的对应日期时间,本地时区
datetime.fromtimestamp(time.time())
datetime.datetime(2021, 2, 8, 22, 41, 5, 35913)
## 返回时间戳的对应日期时间,utc时区
datetime.utcfromtimestamp(time.time())
datetime.datetime(2021, 2, 8, 14, 43, 48, 569356)
## 返回 Gregorian 日历时间序号对应的日期,其中公元 1 年 1 月 1 日的序号为 1
datetime.fromordinal(1)
datetime.datetime(1, 1, 1, 0, 0)
## 返回一个新的 datetime 对象,对象的日期部分等于给定的 date 对象的值,而其时间部分等于给定的 time 对象的值
d = datetime.today()
datetime.combine(d.date(),d.time())
datetime.datetime(2021, 2, 8, 22, 46, 38, 695820)
## 返回一个对应于 date.isoformat() 和 datetime.isoformat() 所提供的某一种 date_string 的 datetime 对象
datetime.fromisoformat('2021-02-10')
datetime.datetime(2021, 2, 10, 0, 0)
## 返回 年、周、日对应的万年历中对应的日期,比如2021年第一个完整周的第1天是1月4日
datetime.fromisocalendar(2021,1,1)
datetime.datetime(2021, 1, 4, 0, 0)
## 返回一个对应于 date_string,根据 format 进行解析得到的 datetime 对象
datetime.strptime('2021-02-10 12:12:12','%Y-%m-%d %H:%M:%S')
datetime.datetime(2021, 2, 10, 12, 12, 12)
类属性
## 最早的可表示 datetime,datetime(MINYEAR, 1, 1, tzinfo=None)
datetime.min
datetime.datetime(1, 1, 1, 0, 0)
## 最晚的可表示 datetime,datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)
datetime.max
datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)
## 两个不相等的 datetime 对象之间可能的最小间隔
date.resolution
datetime.timedelta(days=1)
实例属性
d = datetime.today()
print(d)
2021-02-08 22:53:25.610051
## 年份
d.year
2021
## 月份
d.month
2
## 日
d.day
8
## 小时
d.hour
22
## 分钟
d.minute
53
## 秒
d.second
25
## 微秒
d.microsecond
610051
## tzinfo是关于时区信息的类
## tzinfo是一个抽象类,所以不能直接被实例化
d.tzinfo
##取值范围是 [0, 1]。 用于在重复的时间段中消除边界时间歧义。 (当夏令时结束时回拨时钟或由于政治原因导致当明时区的 UTC 时差减少就会出现重复的时间段。) 取值 0 (1) 表示两个时刻早于(晚于)所代表的同一边界时间。
d.fold
0
实例方法
## 返回具有同样 year, month 和 day 值的 date 对象
d.date()
datetime.date(2021, 2, 8)
## 返回具有同样 hour, minute, second, microsecond 和 fold 值的 time 对象
d.time()
datetime.time(22, 53, 25, 610051)
## 返回具有同样 hour, minute, second, microsecond, fold 和 tzinfo 属性性的 time 对象
d.timetz()
datetime.time(22, 53, 25, 610051)
## 返回一个具有同样属性值的 datetime,除非通过任何关键字参数为某些属性指定了新值
d.replace(day=11)
datetime.datetime(2021, 2, 11, 22, 53, 25, 610051)
## 返回一个具有新的 tzinfo 属性 tz 的 datetime 对象,并会调整日期和时间数据使得结果对应的 UTC 时间与 self 相同,但为 tz 时区的本地时间
d.astimezone()
datetime.datetime(2021, 2, 8, 22, 53, 25, 610051, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), '中国标准时间'))
## 返回一个 time.struct_time,即 time.localtime() 所返回的类型
d.timetuple()
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=8, tm_hour=22, tm_min=53, tm_sec=25, tm_wday=0, tm_yday=39, tm_isdst=-1)
## 如果 datetime 实例 d 为简单型,这类似于 d.timetuple(),不同之处在于 tm_isdst 会强制设为 0
d.utctimetuple()
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=8, tm_hour=22, tm_min=53, tm_sec=25, tm_wday=0, tm_yday=39, tm_isdst=0)
## 返回日期的Gregorian序号,其中公元 1 年 1 月 1 日的序号为 1
d.toordinal()
737829
## 返回对应于 datetime 实例的 时间戳
d.timestamp()
1612796005.610051
## 返回一个整数代表星期几,星期一为 0,星期天为 6
d.weekday()
0
## 返回一个整数代表星期几,星期一为 1,星期天为 7
d.isoweekday()
1
## 返回一个由三部分组成的 named tuple: year, week 和 weekday
d.isocalendar()
(2021, 6, 1)
## 返回一个以 ISO 8601 格式表示的日期和时间字符串
d.isoformat()
'2021-02-08T22:53:25.610051'
d.isoformat(sep=' ')
'2021-02-08 22:53:25.610051'
## 对于 datetime 实例 d,str(d) 等价于 d.isoformat(' ')
d.__str__()
'2021-02-08 22:53:25.610051'
## 返回一个表示日期和时间的字符串
d.ctime()
'Mon Feb 8 22:53:25 2021'
## 返回一个由显式格式字符串所指明的代表日期和时间的字符串,要获取格式指令的完整列表
d.strftime('%Y-%m')
'2021-02'
## 与 datetime.strftime() 相同。 此方法使得为 datetime 对象指定以 格式化字符串字面值 表示的格式化字符串以及使用 str.format() 进行格式化成为可能
d.__format__('%Y-%m')
'2021-02'
2.3. date类
date是表示日期的类,常用属性:year, month, day
date 对象代表一个理想化历法中的日期(年、月和日),即当今的Gregorian向前后两个方向无限延伸。
公元 1 年 1 月 1日是第 1 日,公元 1 年 1 月 2 日是第 2 日,依此类推。
class datetime.date(year, month, day)
所有参数都是必要的。参数必须是在下面范围内的整数:
MINYEAR <= year <= MAXYEAR
1 <= month <= 12
1 <= 日期 <= 给定年月对应的天数
如果参数不在这些范围内,则抛出 ValueError 异常。
from datetime import date
## 返回本地时区当前日期
date.today()
datetime.date(2021, 2, 8)
## 返回时间戳的对应日期,本地时区
date.fromtimestamp(time.time())
datetime.date(2021, 2, 8)
## 返回 Gregorian 日历时间序号对应的日期,其中公元 1 年 1 月 1 日的序号为 1
date.fromordinal(1)
datetime.date(1, 1, 1)
## 返回一个对应于以 YYYY-MM-DD 格式给出的 date_string 的 date 对象
date.fromisoformat('2021-02-09')
datetime.date(2021, 2, 9)
## 返回 年、周、日对应的万年历中对应的日期,比如2021年第一个完整周的第1天是1月4日
date.fromisocalendar(2021,1,1)
datetime.date(2021, 1, 4)
类属性
## 最小的日期
date.min
datetime.date(1, 1, 1)
## 最大的日期
date.max
datetime.date(9999, 12, 31)
## 两个日期对象的最小间隔
date.resolution
datetime.timedelta(days=1)
类的实例属性
## date对象对应的年
date.today().year
2021
## date对象对应的月
date.today().month
2
## date对象对应的日
date.today().day
8
实例方法
d = date.today()
print(d)
2021-02-08
## 返回一个具有同样值的日期
d.replace(day=10)
datetime.date(2021, 2, 10)
## 返回一个 time.struct_time,即 time.localtime() 所返回的类型
d.timetuple()
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=8, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=39, tm_isdst=-1)
## 返回日期的Gregorian序号,其中公元 1 年 1 月 1 日的序号为 1
d.toordinal()
737829
## 返回一个整数代表星期几,星期一为0,星期天为6
d.weekday()
0
## 返回一个整数代表星期几,星期一为1,星期天为7
d.isoweekday()
1
## 返回一个由三部分组成的 named tuple 对象: year, week 和 weekday
d.isocalendar()
(2021, 6, 1)
## 返回一个以 ISO 8601 格式 YYYY-MM-DD 来表示日期的字符串
d.isoformat()
'2021-02-08'
## 对于日期对象 d, str(d) 等价于 d.isoformat()
d.__str__()
'2021-02-08'
## 返回一个表示日期的字符串
d.ctime()
'Mon Feb 8 00:00:00 2021'
## 返回一个由显式格式字符串所指明的代表日期的字符串
d.strftime('%Y-%m')
'2021-02'
## 与 date.strftime() 相同。 此方法使得为 date 对象指定以 格式化字符串字面值 表示的格式化字符串以及使用 str.format() 进行格式化成为可能
d.__format__('%Y-%m')
'2021-02'
## 小例子:计算生日倒计时
import time
from datetime import date
今天 = date.today()
生日 = date(today.year, 4, 7)
生日倒计时 = abs(生日-今天)
生日倒计时.days
58
2.4. time类
一个 time 对象代表某日的(本地)时间,它独立于任何特定日期,并可通过 tzinfo 对象来调整。
class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
所有参数都是可选的。tzinfo 可以是 None,或者是一个 tzinfo 子类的实例。其余的参数必须是在下面范围内的整数:
0 <= hour < 24,
0 <= minute < 60,
0 <= second < 60,
0 <= microsecond < 1000000,
fold in [0, 1].
如果给出一个此范围以外的参数,则会引发 ValueError。所有参数值默认为 0,只有 tzinfo 默认为 None。
关于 time类的 属性、方法等和date类差不多,这里不再做过多赘述。
[参考]:https://docs.python.org/zh-cn/3/library/datetime.html#module-datetime
- END -