【Python】-9.Python日期和时间


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 模块提供了强大的扩展:包括但不限于:

  1. 计算日期差值
  2. 计算两个date或datetime对象的差值
  3. 计算更灵活的时间规则
  4. 解析几乎任何字符串格式的日期
  5. 根据系统信息自动分析时区信息

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)]

文章作者: Soulballad
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Soulballad !
评论
 上一篇
【Python】-10.Python线程和进程 【Python】-10.Python线程和进程
1. 线程Python中关于线程的主要是 _thread 和 threading 模块 1.1 _thread 模块1.1.1 创建线程import time import datetime import _thread date_tim
2020-09-16
下一篇 
【Python】-8.Python文件与IO 【Python】-8.Python文件与IO
1. 打开文件 在Python中无论是从文件中读取内容还是把内容写到文件,都需要先打开文件。打开文件使用内置函数 open open 函数有许多参数,它的定义如下: def open(file, mode=’r’, buffering=
2020-09-13
  目录