1. 基本概念
1.1 时间戳
时间戳是指格林尼治时间1970年01月01日00时00分00秒(即北京时间1970年01月01日08时00分00秒)到现在的总秒数。
1.2 时间日期格式化符号
在Python中会使用到一些特殊的符号来格式化时间日期,类似于字符串格式化中的 “%s” “%d” 等。
符号 | 含义 |
---|---|
%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 | 当前时区的名称 |
%% | %号本身 |
1.3 时间元组
很多Python函数用一个元组装起来的9组数字处理时间:
序号 | 字段 | 值 |
---|---|---|
0 | 4位数年 | 2008 |
1 | 月 | 1 到 12 |
2 | 日 | 1到31 |
3 | 小时 | 0到23 |
4 | 分钟 | 0到59 |
5 | 秒 | 0到61 (60或61 是闰秒) |
6 | 一周的第几日 | 0到6 (0是周一) |
7 | 一年的第几日 | 1到366 (儒略历) |
8 | 夏令时 | -1, 0, 1, -1是决定是否为夏令时的旗帜 |
上述也就是struct_time元组。这种结构具有如下属性:
序号 | 属性 | 值 |
---|---|---|
0 | tm_year | 2008 |
1 | tm_mon | 1 到 12 |
2 | tm_mday | 1 到 31 |
3 | tm_hour | 0 到 23 |
4 | tm_min | 0 到 59 |
5 | tm_sec | 0 到 61 (60或61 是闰秒) |
6 | tm_wday | 0到6 (0是周一) |
7 | tm_yday | 1 到 366(儒略历) |
8 | tm_isdst | -1, 0, 1, -1是决定是否为夏令时的旗帜 |
import time
localtime = time.localtime(time.time())
print "本地时间为 :", localtime
# 本地时间为 : time.struct_time(tm_year=2016, tm_mon=4, tm_mday=7, tm_hour=10, tm_min=3, tm_sec=27, tm_wday=3, tm_yday=98, tm_isdst=0)
2. time模块
2.1 time 函数
time 函数用于返回当前时间的时间戳
import time
now = time.time()
print("当前的时间戳是:%f" % now) # 当前的时间戳是:1605946614.739190
2.2 localtime 函数
localtime 函数用于将时间戳转化为本地时间的 struct_time
import time
print("当前时间", time.localtime())
print("当前时间戳对应的时间", time.localtime(0))
# 当前时间 time.struct_time(tm_year=2020, tm_mon=11, tm_mday=21, tm_hour=16, tm_min=16, tm_sec=54, tm_wday=5, tm_yday=326, tm_isdst=0)
# 当前时间戳对应的时间 time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
2.3 mktime 函数
mktime 将 struct_time 对象转化为用秒表示时间的浮点数。mktime 的参数可以是结构化的时间,也可以是完整的 9 位元组元素
import time
t = (2018, 7, 17, 17, 3, 1, 1, 1, 0)
secs = time.mktime(t)
print("time.mktime(t) : %f" % secs)
print("time.mktime(time.localtime(secs): %f " % time.mktime(time.localtime(secs)))
# time.mktime(t) : 1531818181.000000
# time.mktime(time.localtime(secs): 1531818181.000000
2.4. gmtime 函数
gmtime 将时间戳转化为 UTC 时间的 struct_time
import time
print("time.gmtime(): ", time.gmtime())
print("time.gmtime(0): ", time.gmtime(0))
# time.gmtime(): time.struct_time(tm_year=2020, tm_mon=11, tm_mday=21, tm_hour=8, tm_min=16, tm_sec=54, tm_wday=5, tm_yday=326, tm_isdst=0)
# time.gmtime(0): time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
2.5. asctime 函数
asctime 将时间元组转化为字符串,格式为 “Tue Jul 17 17:03:01 2018”
import time
t = (2018, 7, 17, 17, 3, 1, 1, 1, 0)
print("time.asctime(t)", time.asctime(t))
print("time.asctime(time.localtime())", time.asctime(time.localtime()))
# time.asctime(t) Tue Jul 17 17:03:01 2018
# time.asctime(time.localtime()) Sat Nov 21 16:16:54 2020
2.6. ctime 函数
ctime 将一个时间戳转化为 time.asctime() 的格式
import time
print("time.ctime(): %s " % time.ctime())
print("time.ctime(): %s " % time.ctime(0))
# time.ctime(): Sat Nov 21 16:16:54 2020
# time.ctime(): Thu Jan 1 08:00:00 1970
2.7. sleep 函数
sleep 推迟调用线程的运行,可通过参数 secs 指定秒数,表示进程挂起的时间
import time
print("Start : %s" % time.ctime())
time.sleep(9)
print("End : %s" % time.ctime())
# Start : Sat Nov 21 16:24:19 2020
# End : Sat Nov 21 16:24:28 2020
2.8. strftime 函数
strftime 接收时间元组,并返回可读字符串表示的当地时间,格式由参数 format 决定
import time
t = (2018, 7, 17, 17, 3, 1, 1, 1, 0)
t = time.mktime(t)
print(time.strftime("%b %d %Y %H:%M:%S", time.gmtime(t)))
# Jul 17 2018 09:03:01
2.9. strptime 函数
strptime 能够根据指定的时间格式,将时间字符串转化为时间元组
import time
struct_time = time.strptime("Jul 17 2018 09:03:01", "%b %d %Y %H:%M:%S")
print("返回的元组: ", struct_time)
# 返回的元组: time.struct_time(tm_year=2018, tm_mon=7, tm_mday=17, tm_hour=9, tm_min=3, tm_sec=1, tm_wday=1, tm_yday=198, tm_isdst=-1)
3. datetime模块
datetime 模块包含了日期和时间的所有信息,它的功能十分强大,支持从0001到99999年之间的日期
datetime 模块内定义了两个常量: datetime.MINYEAY 和 date.MAXYEAR;这两个常量分别表示 1 和 99999
3.1. date 对象
3.1.1 date
date 对象表示日历中的一个日期。date 对象的构造函数需要传入三个参数: year、month、day
import datetime
date = datetime.date(2018, 7, 1)
print(date) # 2018-07-01
3.1.2 today
today 返回当前日期
import datetime
date = datetime.date.today()
print(date) # 2020-11-21
3.1.3 weekday
weekday 返回当前星期几,星期一返回0,星期二返回1,以此类推
import datetime
today = datetime.date.today()
print(today.weekday()) # 5
3.1.4 isoweekday
isoweekday 返回当前星期几,星期一返回1,星期二返回2,以此类推
import datetime
today = datetime.date.today()
print(today.isoweekday()) # 6
3.1.5 isoformat
isoformat 返回日期为 ISO 格式的字符串,即 “YY-MM-DD”;直接输出date对象就是调用的 isoformat 方法
import datetime
today = datetime.date.today()
print(today.isoformat()) # 2020-11-21
3.1.6 strftime
strftime 格式化输出日期
import datetime
date = datetime.date(2018, 7, 17)
print(date.strftime("%Y-%m-%d")) # 2018-07-17
print(date.strftime("%y-%b-%d")) # 18-Jul-17
3.2. time 对象
3.2.1 time
time 对象表示一天中的时间。time 对象的构造函数接收 时、分、秒、微秒、时区和信息等参数
import datetime
time1 = datetime.time()
print(time1) # 00:00:00
time2 = datetime.time(hour=8, second=7)
print(time2) # 08:00:07
3.2.2 time 中的常量
time 对象有两个常量 min 和 max,分别对应time能表示的最小值和最大值
import datetime
print(datetime.time.min) # 00:00:00
print(datetime.time.max) # 23:59:59.999999
print(datetime.time.resolution) # 0:00:00.000001,resolution 表示一微秒,是常量
3.2.3 isoformat
isoformat 返回 ISO 格式的字符串,“HH:MM:SS”
import datetime
t1 = datetime.time(hour=8, second=7)
print(t1.isoformat()) # 08:00:07
3.2.4 strftime
strftime 格式化输出时间
import datetime
t1 = datetime.time(hour=8, second=7, microsecond=123)
print(t1.strftime("%H:%M:%S")) # 08:00:07
print(t1.strftime("%p %I:%M:%S:%f")) # AM 08:00:07:000123
3.3. datetime 对象
3.3.1 datetime初始化
datetime 对象是 date 与 time 的结合体,包括 date 与 time 的所有信息
import datetime
dt = datetime.datetime(year=2018, month=7, day=17, hour=15, second=10)
print(dt) # 2018-07-17 15:00:10
3.3.2 today
today 返回一个表示当前本地时间的 datetime 对象
import datetime
today = datetime.datetime.today()
print(today) # 2020-11-21 16:26:54.388715
3.3.3 now
now 返回一个表示当前本地时间的 datetime 对象
import datetime
now = datetime.datetime.now()
print(now) # 2020-11-21 16:26:54.388715
3.3.4 utcnow
utcnow 返回一个表示当前 UTC 时间的 datetime 对象
import datetime
now = datetime.datetime.utcnow()
print(now) # 2020-11-21 08:26:54.388715
3.3.5 fromtimestamp
fromtimestamp 根据时间戳创建一个 datetime 对象
import time
import datetime
t1 = datetime.datetime.fromtimestamp(time.time() - 86400)
print(t1) # 2020-11-20 16:26:54.388715
3.3.6 date+time
date 方法获取date对象,time方法获取time对象
import time
import datetime
now = datetime.datetime.now()
print(now.date()) # 2020-11-21
print(now.time()) # 16:26:54.388715
3.3.7 combine
combine 根据 date 和 time 组建一个 datetime 对象
import datetime
date = datetime.date(2018, 7, 17)
time = datetime.time(8, 15, 10)
dt = datetime.datetime.combine(date, time)
print(dt) # 2018-07-17 08:15:10
3.3.8 strftime
strftime 格式化输出的日期和时间
import datetime
date = datetime.date(2018, 7, 17)
time = datetime.time(8, 15, 10)
dt = datetime.datetime.combine(date, time)
print(dt.strftime("%Y-%m-%d %H:%M:%S")) # 2018-07-17 08:15:10
print(dt.strftime("%y-%m-%d %a %I:%M:%S")) # 18-07-17 Tue 08:15:10
3.4. timedelta
timedelta 表示的是两个日期或时间的差,属性包含: 日期、秒、微秒、毫秒、分、小时和星期
import datetime
dt1 = datetime.datetime(2018, 7, 1, 16, 15, 10)
dt2 = dt1 + datetime.timedelta(weeks=-2)
print(dt1) # 2018-07-01 16:15:10
print(dt2) # 2018-06-17 16:15:10
print(dt1 - dt2) # 14 days, 0:00:00
print(dt2 - dt1) # -14 days, 0:00:00
3.5. tzinfo 对象
3.5.1 datetime.timezone.utc
tzinfo 是时区对象的一个抽象类。tzinfo 不能直接使用,但是可以使用 datetime.timezone 生成。datetime.timezone.utc 实现了 UTC 时区的 tzinfo 实例
import datetime
utc_now1 = datetime.datetime.now(datetime.timezone.utc)
utc_now2 = datetime.datetime.utcnow()
print(utc_now1) # 2020-11-21 08:26:54.388715+00:00
print(utc_now2) # 2020-11-21 08:26:54.388715
3.5.2 自定义时区
datetime.timezone 是 tzinfo 的子类,使用 datetime.timezone 来自定义时区
import datetime
china_timezone = datetime.timezone(datetime.timedelta(hours=8))
utc_timezone = datetime.timezone(datetime.timedelta(hours=0))
china_time = datetime.datetime.now(china_timezone)
utc_time = datetime.datetime.now(utc_timezone)
print(china_time) # 2020-11-21 16:26:54.388715+08:00
print(utc_time) # 2020-11-21 08:26:54.388715+00:00
4. calendar模块
calendar 模块是一个和日历相关的模块,该模块主要用于输出某月的字符月历。
4.1 isleap
isleap 判断是否为闰年,如果是返回 True,否则返回 False
import calendar
print(calendar.isleap(2000)) # True
print(calendar.isleap(2018)) # False
4.2 leapdays
leapdays 返回两个年份之间的闰年总数
import calendar
print(calendar.leapdays(1990, 2018)) # 7
print(calendar.leapdays(2017, 2018)) # 0
4.3 month
month 返回一个月的日志
import calendar
print(calendar.month(2018, 7))
print(calendar.month(2018, 7, w=3))
print(calendar.month(2018, 7, l=3))
4.4 monthclendar
monthclendar 返回一个整数的单层嵌套列表,每个子列表装载一个星期。该月之外的日期都为0
import calendar
print(calendar.monthcalendar(2018, 7))
# [[0, 0, 0, 0, 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, 31, 0, 0, 0, 0, 0]]
4.5 monthrange
monthrange 返回两个整数组成的元组: 第一个整数表示该月的第一天是星期几,第二个整数表示该月的天数
import calendar
print(calendar.monthrange(2018, 7)) # (6, 31)
4.6 weekday
weekday 返回给定日期是星期几对应的数字,从 0(星期一)到6(星期日)
import calendar
print(calendar.weekday(2018, 7, 1)) # 6
4.7 calendar
calendar 返回一年的日历
import calendar
print(calendar.calendar(2018))
5. dateutil
dateutil 库为 Python 内置的 datetime 模块提供了强大的扩展:包括但不限于:
- 计算日期差值
- 计算两个date或datetime对象的差值
- 计算更灵活的时间规则
- 解析几乎任何字符串格式的日期
- 根据系统信息自动分析时区信息
dateutil 需要手动安装,使用如下命令:
pip install python-dateutil
conda install python-dateutil
dateutil 库有两个比较常用的模块: parse模块、rrule模块
5.1. parser 模块
from dateutil.parser import parse
print(parse("Sat Oct 11 17:13:46 UTC 2003")) # 2003-10-11 17:13:46+00:00
print(parse("2018-08-20")) # 2018-08-20 00:00:00
print(parse("20180820")) # 2018-08-20 00:00:00
print(parse("12:00:00")) # 2020-11-21 12:00:00
# fuzzy 开启模糊匹配,过滤掉无法识别的时间日期字符
# print(parse("this is the wonderful moment 12:00:00, I feel good", fuzzy=True)) # 2020-11-21 12:00:00
parse 其他参数,例如时区,默认起始时间等
from dateutil.parser import *
from dateutil.tz import *
from datetime import *
TZOFFSETS = {"BRST":-10800}
BRSTTZ = tzoffset("BRST",-10800)
DEFAULT = datetime(2003,9,25)
# t = parse("The sep 25 10:36:28 BRST 2003", tzinfo = TZOFFSETS)
# print(t)
5.2. rrule 模块
rrule 模块用于计算并生成一些重复的时间规则
import pprint
from dateutil.rrule import rrule, MONTHLY
from datetime import datetime
start_date = datetime(2014,12,13)
l = list(rrule(freq=MONTHLY, count=4, dtstart=start_date))
pprint.pprint(l)
# [datetime.datetime(2014, 12, 13, 0, 0),
# datetime.datetime(2015, 1, 13, 0, 0),
# datetime.datetime(2015, 2, 13, 0, 0),
# datetime.datetime(2015, 3, 13, 0, 0)]