python专题时间模块
一 前言
此篇时间专题,知识追寻者发了比较大的代价完成,虽然还有许多不足之处,但对于日常开发是足够用了,比如获取当前时间,当前日期,时间与字符串格式互转,从时间戳中获取时间对象等等;如果读者还想深入学习,可以参考官方文档;
公众号:知识追寻者
知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)
二 日期时间类型概览
类型 | 说明 |
---|---|
datetime.date | 日期,属性是,yer, month, day |
datetime.time | 时间;属性是hour, minute, second, microsecond, tzinfo |
datetime.datetime | 日期和时间;属性是date 和 time 的 并集 |
datetime.timedelta | 可以是两个date, time 或者 datetime之间的时间差 |
datetime.tzinfo | 时区的抽象类;给time或者 datetime 提供自定义的时间调整 |
datetime.timezone | datetime.tzinfo的具体实现,用于矫正UTC时间偏移 |
三 date
3.1 date函数概览
函数名称 | 函数介绍 |
---|---|
date.today() | 返回当前本地时间 |
date.fromtimestamp() | 从时间搓中返回时间 |
date.fromisoformat(date_string) | 从YYYY-MM-DD 中获取日期对象 |
date.fromisocalendar(year, week, day) | 指定年,周,天获得日期对象 |
date.replace(year=self.year, month=self.month, day=self.day) | 取代任意一个属性,返回date对象 |
date.timetuple() | 返回一个time.struct_time |
date.toordinal() | 返回日期对应的 Gregorian Calendar 日期 |
date.weekday() | 返回星期 0 ~ 6 (0是星期一) |
date.isoweekday() | 返回星期 1 ~ 7 (1是星期一) |
date.isocalendar() | 返回元组(ISO year, ISO week number, ISO weekday) |
date.isoformat() | 返回一个格式化为YYYY-MM-DD的日期 |
date.__str__() |
对于date对象,等同于date.isoformat() |
date.ctime() | 字符串代表时间 |
date.strftime(format) | 时间自定义格式化 |
date.__format__(format) |
与date.strftime(format)类似 |
3.2 date属性概览
属性名称 | 属性介绍 |
---|---|
date.min | 代表日期的最小值,date(MINYEAR, 1, 1) |
date.max | 代表日期的最大值,date(MAXYEAR, 12, 31) |
date.resolution | 两个日期对象的最小间隔 |
date.year | 日期的年份,MINYEAR - MAXYEAR |
date.month | 日期月份,1-12 |
date.day | 返回指定的天数 |
3.3 today()
当前日期
# -*- coding: utf-8 -*-
from datetime import date
print(date.today())
输出
2020-01-31
3.4 fromtimestamp()
来自时间戳返回一个当前日期对象
# -*- coding: utf-8 -*-
from datetime import date
print(date.fromtimestamp(1580473517.3424315))
输出
2020-01-31
3.5fromisoformat(date_string)
来自字符串返回一个日期对象
# -*- coding: utf-8 -*-
from datetime import date
local_date = date.fromisoformat('2020-01-31')
print(type(local_date))
print(local_date)
输出
<class 'datetime.date'>
2020-01-31
3.6 fromisocalendar(year, week, day)
指定 年份, 周, 天 获得 日期对象
# -*- coding: utf-8 -*-
from datetime import date
specify_date = date.fromisocalendar(2020, 4, 3)
print(type(specify_date))
print(specify_date)
输出
<class 'datetime.date'>
2020-01-22
3.7 date.replace()
可以取代年,或者月,或者日;下面代码中以日为例:
# -*- coding: utf-8 -*-
from datetime import date
current_date = date(2020,1,31)
rep_date = current_date.replace(day=1)
print(type(rep_date))
print(rep_date)
输出
<class 'datetime.date'>
2020-01-01
3.8 timetuple()
返回一个时间元组,读者可以对其进行迭代;
# -*- coding: utf-8 -*-
from datetime import date
current_date = date.today()
print(current_date.timetuple())
输出
time.struct_time(tm_year=2020, tm_mon=1, tm_mday=31, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=31, tm_isdst=-1)
3.9 date.toordinal()
unix时间(UTC) 与 Gregorian (公厉时间)时间互转
# 当前时间
current_date = date.today()
# 时间转换
ordinal = date.fromordinal(current_date.toordinal())
print(ordinal)
输出
2020-02-01
3.10 date.weekday()
0 表示星期一,以此类推(0-6);5表示星期六;
# -*- coding: utf-8 -*-
from datetime import date
# 当前时间
current_date = date.today()
print(current_date.weekday())
输出
5
3.11date.isoweekday()
1 表示星期一,6表示星期六,以此类推(1-7);
# -*- coding: utf-8 -*-
from datetime import date
# 当前时间
current_date = date.today()
print(current_date.isoweekday())
输出
6
3.12date.isocalendar()
返回元组(ISO year, ISO week number, ISO weekday); 2020-2-1 号 表示 2020 年 第五周的第六天;
# -*- coding: utf-8 -*-
from datetime import date
# 当前时间
current_date = date.today()
print(current_date.isocalendar())
输出
(2020, 5, 6)
3.13 date.isoformat()
返回一个格式化为YYYY-MM-DD的日期
# -*- coding: utf-8 -*-
from datetime import date
# 指定时间
specify_date = date(2020,2,1)
print(specify_date.isoformat())
输出
2020-02-01
3.14 date.__str__()
对于date 等同于date.isoformat();
# -*- coding: utf-8 -*-
from datetime import date
# 指定时间
specify_date = date(2020,2,1)
print(specify_date.__str__())
输出
2020-02-01
3.15 date.ctime()
字符串形式表示时间
# -*- coding: utf-8 -*-
from datetime import date
# 指定时间
specify_date = date(2020,2,1)
print(specify_date.ctime())
输出
Sat Feb 1 00:00:00 2020
3.16 date.strftime(format)
日期格式化,具体的字符串代表含义看第四节
# -*- coding: utf-8 -*-
from datetime import date
# 指定时间
specify_date = date(2020,2,1)
print(specify_date.strftime('%Y%m%d'))
输出
20200201
3.17date.__format__(format)
功能类似date.strftime(format);
# -*- coding: utf-8 -*-
from datetime import date
# 指定时间
specify_date = date(2020,2,1)
print(specify_date.__format__('%Y%m%d'))
输出
20200201
四 格式化符号
格式化符号如下,只需要记住常用的几个符号代表,当有使用到时再来查阅文档即可;
- %y 两位数的年份表示(00-99)
- %Y 四位数的年份表示(000-9999)
- %m 月份(01-12)
- %d 月内中的一天(0-31)
- %H 24小时制小时数(0-23)
- %I 12小时制小时数(01-12)
- %M 分钟数(00=59)
- %S 秒(00-59)
- %a 本地简化星期名称
- %A 本地完整星期名称
- %b 本地简化的月份名称
- %B 本地完整的月份名称
- %c 本地相应的日期表示和时间表示
- %j 年内的一天(001-366)
- %p 本地A.M.或P.M.的等价符
- %U 一年中的星期数(00-53)星期天为星期的开始
- %w 星期(0-6),星期天为星期的开始
- %W 一年中的星期数(00-53)星期一为星期的开始
- %x 本地相应的日期表示
- %X 本地相应的时间表示
- %Z 当前时区的名称
- %% %号本身s
五 datetime模块中的time
知识追寻者在time模块具有同等功能的函数将不再重复给出示例;注意这篇文章给出的time是 datetime引入的time; 不是直接引入的time模块
5.1 time 属性
fold 属性 知识追寻者也没研究代表什么;
属性名称 | 属性介绍 |
---|---|
time.min | 最小时间;time(0, 0, 0, 0) |
time.max | 最大时间;time(23, 59, 59, 999999) |
time.resolution | 两个时间之间最小间隔 |
time.hour | 小时;0-24 |
time.minute | 分钟;0-60 |
time.second | 秒;0-60 |
time.microsecond | 微妙;0-1000000 |
time.tzinfo | 作为参数传给time的构造函数 |
5.2time 函数
函数名称 | 函数介绍 |
---|---|
time.replace (hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, ** fold=0*) |
给出一个属性,取代其值,生成新的时间; |
time.__str__ () |
对于time等同于time.isoformat() |
time.isoformat() | 返回一个 ISO 8601 格式的日期字符串,类似HH:MM:SS |
time.strftime(format) | 返回自定义格式的时间 |
time.__format__(format) |
与 time.strftime(format) 类似 |
time.utcoffset() | 如果 tzinfo 属性是 None,返回 None;否则返回 self.tzinfo.utcoffset(self) |
time.dst() | 如果 tzinfo 属性是 None,返回 None;否则返回 self.tzinfo.dst(self) |
time.tzname() | 如果 tzinfo 属性是 None,返回 None;否则返回 self.tzinfo.tzname(self) |
5.3time.replace
取代一个时间属性获得新的time对象
# -*- coding: utf-8 -*-
from datetime import time
current_time = time(9,10,2)
print(current_time.replace(hour=8))
输出
08:10:02
5.4 time.isoformat()
会根据你给的时间模式给出不同的时间支持 HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]
# -*- coding: utf-8 -*-
from datetime import time
# 给定时间 小时,分钟,秒
current_time = time(9,10,2)
print(current_time.isoformat())
# 给定时间 小时,分钟,秒,微妙
other_time = time(9,10,2,3666)
print(other_time.isoformat())
输出
09:10:02
09:10:02.003666
5.5 time.strftime(format)
# -*- coding: utf-8 -*-
from datetime import time
current_time = time(9,10,2)
print(current_time.strftime('%H%M%S'))
输出
091002
六 time
本节的time是直接的time模块
6.1 time 函数
time常用函数如下
函数名称 | 函数介绍 |
---|---|
time.time( ) | 获取当前时间的时间戳 |
time.sleep(secs) | 推迟线程运行的秒数 |
time.strftime(fmt[,tupletime]) | 时间格式化,返回字符串 |
time.strptime(str,fmt='%a %b %d %H:%M:%S %Y') | 时间格式化,返回元组 |
time.localtime([secs] | 给定一个时间戳,返回时间元组 |
time.ctime([secs]) | 返回一个字符串表示的时间 |
6.2 time.time( )
返回一个当前时间的时间戳
# -*- coding: utf-8 -*-
import time
print(time.time())
输出
1580564033.1096103
6.3 time.sleep(secs)
读者在执行下面这段代码时,线程会等待5秒才会执行完毕
# -*- coding: utf-8 -*-
import time
time.sleep(5)
6.4 time.strftime()
时间格式化,返回字符串
# -*- coding: utf-8 -*-
import time
print(time.strftime(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
输出
2020-02-01 21:37:22
6.5 time.localtime()
返回一个本地时间的元组格式
# -*- coding: utf-8 -*-
import time
print(time.localtime())
输出
time.struct_time(tm_year=2020, tm_mon=2, tm_mday=1, tm_hour=21, tm_min=40, tm_sec=14, tm_wday=5, tm_yday=32, tm_isdst=0)
6.6 time.ctime()
字符串形式表示时间
# -*- coding: utf-8 -*-
import time
print(time.ctime())
输出
Sat Feb 1 21:43:49 2020
七 datetime
有了date 和 time 基本功能 学 datetime 和容易,毕竟是date 和 time的 组合体;所以本节中datetime的属性就不做多余介绍就是date, time的属性并集;datetime与date,time的很多重名函数将也不在重复介绍,功能都相同;
7.1 datetime常用函数
函数名称 | 函数介绍 |
---|---|
datetime.today() | 获取当前时间,本地时间格式 |
datetime.now(tz=None) | 返回当前时间 |
datetime.date() |
返回一个date对象,剔除time部分 |
datetime.time() |
返回一个time对象,剔除date部分 |
datetime.timetz() | 返回一个time对象并且包含时区部分,剔除date部分 |
datetime.fromtimestamp(timestamp, tz=None) |
从时间戳获取unix时间 |
datetime.combine(date, time) | 将date,time结合为datetime对象 |
datetime.strptime(date_string, format) | 时间格式化,返回字符串 |
datetime.strptime( date_string, format) | 通过字符串返回时间 |
7.2 datetime.today()
# -*- coding: utf-8 -*-
from datetime import datetime, time, date
print(datetime.today())
输出
2020-02-01 22:03:31.041202
7.2 datetime.now()
# -*- coding: utf-8 -*-
from datetime import datetime, time, date
print(datetime.today())
输出
2020-02-01 22:08:18.077103
7.3datetime. fromtimestamp()
从时间戳中获取Unix时间
# -*- coding: utf-8 -*-
from datetime import datetime, time, date
import time as zszxz_time
specify_time = datetime(2020,2,1,22,9,30,30)
print(specify_time.fromtimestamp(zszxz_time.time()))
输出
2020-02-01 22:13:05.058196
7.4datetime.combine()
# -*- coding: utf-8 -*-
from datetime import datetime, time, date
time = time(22,18,0)
date = date(2020,2,1)
print(datetime.combine(date,time))
输出
2020-02-01 22:18:00
7.5 datetime.strptime()
时间转字符串
# -*- coding: utf-8 -*-
from datetime import datetime, time, date
specify_time = datetime(2020,2,1,22,9,30)
print(specify_time.strftime('%Y/%m/%d %H/%M/%S'))
输出
2020/02/01 22/09/30
7.6datetime.strptime()
字符串转时间
# -*- coding: utf-8 -*-
from datetime import datetime, time, date
print(datetime.strptime('2020/02/01 22/09/30','%Y/%m/%d %H/%M/%S'))
输出
2020-02-01 22:09:30
八 timedelta
timedelta是一个时间增量用于对我们原有的时间进行加减等操作,时间增量是不以年分,月份为计量;以下代码给出简单的timedelta操作,很容易推理出日常操作;如果还想深入研究可以参考官方文档;
8.1 指定时间增量
from datetime import datetime,timedelta
delta = timedelta(
days=50,
seconds=27,
microseconds=10,
milliseconds=29000,
minutes=5,
hours=8,
weeks=2
)
print(type(delta))
print(delta)
输出
<class 'datetime.timedelta'>
64 days, 8:05:56.000010
8.2 对时间进行加操作
from datetime import datetime,timedelta
# 当前时间
current = datetime.now()
# 时间增量 天数
delta = timedelta(days=100)
# 当前时间 加上 增量天数
print(current+delta)
输出
2020-05-11 22:45:05.199823
九 参考文档
https://docs.python.org/3/library/datetime.html#time-objects