python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > 模块time和datetime详解

Python时间处理模块time和datetime详解

作者:【1758872】的博客

本文详细介绍了Python中常用的时间处理模块time和datetime,time模块提供多种时间获取和转换功能,datetime模块则在time的基础上增加了日期和时间的组合处理,如datetime.now()获取当前日期时间,两个模块在日常编程中非常有用,尤其是在需要时间日期计算和转换的场景下

一、time 模块

time模块是Python标准库中最基础、最常用的模块之一。它提供了各种处理时间的方法和函数,如获取当前时间、格式化时间、计算时间差等。time模块大部分函数的底层实现是 C 语言库的时间处理函数。

1.1、获取时间相关函数

1.1.1、time.time()函数

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,由于是基于Unix Timestamp,所以其所能表述的日期范围被限定在 1970 ~ 2038 之间。

获取当前的时间戳(从Unix纪元开始的秒数),返回一个浮点型数值。

import time
 
# 获取当前的时间戳(以秒为单位)
print(time.time())  # 1724168591.386799
# 获取当前的纳秒级时间戳
print(time.time_ns())  # 1724168591386807429
# 将时间戳精确到毫秒然后四舍五入,说明:1秒=1000毫秒=1000000微秒=1000000000纳秒
print(round(time.time() * 1000))  # 1724168591387

1.1.2、time.ctime()函数

将时间戳转换为可读的字符串形式,如“Thu Aug 22 13:44:12 2024”。

import time
print(time.ctime())  # Thu Aug 22 13:44:12 2024

1.1.3、time.gmtime()函数

获取当前的时间,并将时间戳转换为UTC时区的时间,此方法返回的是一个时间元组。

struct_time时间元组,为结构化数据,共有九个元素。

import time
print(time.gmtime())  # time.struct_time(tm_year=2024, tm_mon=8, tm_mday=22, tm_hour=5, tm_min=46, tm_sec=5, tm_wday=3, tm_yday=235, tm_isdst=0)

1.1.4、time.localtime([sec])函数

获取当前的时间,并将时间戳转化成一个本地时区的struct_time,如果sec参数未输入,则以当前时间为转化标准。

import time

# 将时间戳传递给localtime函数得到时间元组
c_time = time.localtime(time.time())
print(c_time)  # time.struct_time(tm_year=2024, tm_mon=8, tm_mday=21, tm_hour=11, tm_min=6, tm_sec=23, tm_wday=2, tm_yday=234, tm_isdst=0)
# 直接调用localtime()函数也是可以得到时间元组
l_time = time.localtime()
print(l_time)  # time.struct_time(tm_year=2024, tm_mon=8, tm_mday=21, tm_hour=11, tm_min=6, tm_sec=23, tm_wday=2, tm_yday=234, tm_isdst=0)

1.2、格式化时间相关函数

1.2.1、time.asctime()函数

最简单的获取可读的时间模式的函数是asctime()。

import time
 
c_time = time.localtime(time.time())
print(time.asctime(c_time))  # Wed Aug 21 11:19:14 2024
l_time = time.localtime()
print(time.asctime(l_time))  # Wed Aug 21 11:19:14 2024

1.2.2、time.strftime()函数

strftime(format, time):将时间元组(struct_time对象)格式化为字符串,可以指定格式。 

import time
 
formattime1 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(formattime1)  # 输出字符串格式的时间:2024-08-21 11:26:37
formattime2 = time.strftime("%a %b %d %H:%M:%S %Y", time.localtime())
print(formattime2)  # 输出字符串格式的时间:Wed Aug 21 11:26:37 2024

1.2.3、time.strptime()函数

strptime(date_string, format):将字符串解析为时间元组,可以指定格式。

import time
 
t1 = time.strptime("2024-03-11 10:45:55", "%Y-%m-%d %H:%M:%S")
print(t1)  # time.struct_time(tm_year=2024, tm_mon=3, tm_mday=11, tm_hour=10, tm_min=45, tm_sec=55, tm_wday=0, tm_yday=71, tm_isdst=-1)

1.2.4、time.mktime() 函数

time.mktime() :函数的参数是一个struct_time对象或完整的9位元组,表示本地时间,将该时间元组解析为一个时间戳。

import time
 
timestamp1 = time.mktime(time.localtime())
print(timestamp1)  # 1724220894.0
timestamp2 = time.mktime(time.strptime("2023-03-11 09:35:11", "%Y-%m-%d %H:%M:%S"))
print(timestamp2)  # 1678498511.0

二、datetime模块

datetime模块是Python中处理日期和时间的高级模块,datetime模块是在time模块的基础上开发的,是对time模块的补充和扩展,可以提供更精确和高效的时间处理功能,它提供了更加丰富和灵活的时间处理功能,支持更多的时间格式和时间操作,并且功能更加强大。datetime模块提供了日期(date)、时间(time)、日期时间(datetime)等类型的操作。它也是基于C语言的时间库实现的。

datetime模块定义了下面这几个类:

datetime.date:表示日期的类,有3个属性(year、month、day),可进行日期的加减运算。 datetime.time:表示时间的类,有4个属性(hour、minute、second、microsecond),可以进行时间的加减运算。 datetime.datetime:表示一个具体的日期时间,是date类和time类的结合体,具有date类和time类的所有属性和方法。 datetime.timedelta:表示时间间隔,即两个时间点之间的长度。 datetime.tzinfo:与时区有关的相关信息。 datetime.datetime_CAPI:日期时间对象C语言接口。

2.1、datetime.date类介绍

由于Python也是面向对象编程语言,所以针对类,就会有构造函数,该类的构造函数如下: 

class datetime.date(year, month, day): 

year: 表示年,范围[MINYEAR, MAXYEAR],即[1, 9999] month: 表示月,范围[1, 12] day:一月中第几天,最大值根据给定的year,month参数来决定。例如闰年2月份有29天

2.1.1、date对象所能表示的最大最小日期

# 返回的是datetime.date类型的对象

# 返回的是datetime.date类型的对象
import datetime
print(datetime.date.max)  # 9999-12-31
print(datetime.date.min)  # 0001-01-01

2.1.2、date.today() 函数

# 返回一个当前本地日期的date类型的对象

# 返回一个当前本地日期的date类型的对象
import datetime
print(datetime.date.today())  # 2024-08-21

2.1.3、date.fromtimestamp()函数

# 根据给定的时间戳,返回一个date对象

# 根据给定的时间戳,返回一个date对象
import time
import datetime
 
now = time.time()
s = datetime.date.fromtimestamp(now)  # 2024-08-21

2.1.4、date.weekday()函数

# 参数必须是一个date类型的对象,返回该日期是一周中的第几天。返回值是一个整型。星期一,返回0;星期二,返回1...

# 参数必须是一个date类型的对象,返回该日期是一周中的第几天。返回值是一个整型。星期一,返回0;星期二,返回1...
import datetime
s = datetime.date.today()  # 输出:2024-08-21
d = datetime.date.weekday(s)  # 输出:2

2.1.5、date.isoweekday()函数

# 该函数需要一个datetime.date类型的参数。返回weekday中的星期几,星期一,返回1;星期二,返回2;以此类推。

# 该函数需要一个datetime.date类型的参数。返回weekday中的星期几,星期一,返回1;星期二,返回2;以此类推。
import datetime
s = datetime.date.today()  # 输出:2024-08-21
d = datetime.date.isoweekday(s)  # 输出:3

2.1.6、date.isocalendar()函数

例如,2004 年的第一天是星期四,因此 ISO 2004 年的第一个星期开始于 2003 年 12 月 29 日星期一,结束于 2004 年 1 月 4 日星期日

# 该函数需要一个datetime.date类型的参数。返回date类型对象中的year(年),week(周),weekday(一周中的第几天),返回值是一个元组
import datetime
s = datetime.date(2003, 12, 29)  # 2003-12-29
d = datetime.date.isocalendar(s)  # datetime.IsoCalendarDate(year=2004, week=1, weekday=1), 代表2004年中的第1周,第1周中的第1天

2.1.7、date.strftime(fmt)函数

# 返回自定义格式的时间字符串。fmt是自定义的时间格式
import datetime
s = datetime.date.today()  # 2024-08-21
d = s.strftime("%Y-%m-%d %H:%M:%S")  # 2024-08-21 00:00:00

2.1.8、date.replace(year, month, day)

# 生成一个新的日期对象  用参数指定的年,月,日代替原有对象中的属性。(原有对象仍保持不变)
import datetime
s = datetime.date.today()  # 2024-08-21
d = s.replace(year=2017)  # 2017-08-21

2.2、datetime.time类介绍

待续~

2.3、datetime.datetime类介绍

2.3.1、datetime.now()函数

# 返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间。
from datetime import datetime
 
# 获取当前日期时间
print(datetime.now())  # 2024-08-21 15:41:42.388216
# 获取当前时间
print(datetime.now().time())  # 15:41:42.388216
# 获取当前日期
print(datetime.now().date())  # 2024-08-21
# 获取当前时间元组
print(datetime.now().timetuple())  # time.struct_time(tm_year=2024, tm_mon=8, tm_mday=21, tm_hour=15, tm_min=41, tm_sec=42, tm_wday=2, tm_yday=234, tm_isdst=-1)

2.3.2、datetime.strftime()函数

datetime.strftime(datetime, format):将datetime对象格式化为字符串,可以指定格式。

# 返回自定义格式的时间字符串。fmt是自定义的时间格式
from datetime import datetime
 
now = datetime.now()
print(now)  # 2024-08-21 22:49:27.570491
print(now.strftime("%Y-%m-%d %H:%M:%S"))  # 2024-08-21 22:49:27
print(now.strftime("%Y-%m-%d"))  # 2024-08-21
print(now.strftime("%H:%M:%S"))  # 22:49:27
 
# 如果我们想将01/09中的0给去掉该如何实现呢?不同的操作系统实现方式不一样
print(now.strftime('%Y/%-m/%-d'))  # Linux平台: 2024/8/21
print(now.strftime('%Y/%#m/%#d'))  # Windows平台: 2024/8/21

2.3.3、datetime.strptime()函数

datetime.strptime(date_string, format):将字符串解析成datetime对象,可以指定格式。

from datetime import datetime
 
d = datetime.strptime("2018-10-08 09:00:00", "%Y-%m-%d %H:%M:%S")  # 2018-10-08 09:00:00
print(type(d))  # <class 'datetime.datetime'>

2.3.4、datetime.timestamp()函数

from datetime import datetime
 
# 创建一个datetime对象,假设为2023年3月1日中午12点
dt = datetime(2023, 3, 1, 12, 0)
# 将datetime对象转换为时间戳
timestamp = dt.timestamp()  # 1677643200.0
# 获取当前时间的时间戳
print(datetime.now().timestamp())  # 1724343305.378539

2.3.5、datetime.fromtimestamp()函数

datetime.fromtimestamp(timestamp, tz=None):用于将Unix时间戳转换为datetime对象,其中timestamp是Unix时间戳,tz是时区信息(可选)

# 返回时间戳对应的本地日期时间
from datetime import datetime
print(datetime.fromtimestamp(1724230448.0))  # 2024-08-21 16:54:08

2.3.6、datetime.replace()函数

替换日期时间的某个部分,返回新的datetime对象。

# 替换部分日期时间
dt = datetime.datetime(2022, 10, 1, 12, 30, 45)
new_dt = dt.replace(year=2023)
print(new_dt)

2.4、datetime.timedelta类介绍

timedelta对象代表两个时间之间的时间差,我们进行时间上的增减的时候就可以用timedelta实现,timedelta类可以很容易地算出前几天或后几天的时刻,还可以查看第几周对应的时间,例如:timedelta(weeks=20) 20周将被自动转化为天数,前几天时刻,用减法,后几天时刻,则用当前时间加上timedelta(days=d, hours=h)。

2.4.1、两个date对象做差(相差多少天)

from datetime import date
 
d1 = date(2018, 10, 18)  # 构建日期对象
d2 = date(2017, 12, 31)  # 构建日期对象
d3 = date.today()  # 获取当天的日期
print((d1 - d2).days)  # 291
print(d3 - d2)  # 2425 days, 0:00:00
print(d3.__sub__(d2))  # 2425 days, 0:00:00

2.4.2、两个datetime对象做差(相差多少秒)

from datetime import datetime
 
time1 = datetime(2019, 1, 13, 12, 0, 0)  # 构建日期时间对象
time2 = datetime.now()  # 获取当前日期时间对象
# 计算两个日期时间对象的时间差(以秒计算)
differtime = (time2 - time1).total_seconds()  # 176881267.568535

2.4.3、计算未来和过去的时间

timedelta取值(days=0,seconds=0,microseconds=0,milliseconds=0,minutes=0,hours=0,weeks=0)

使用 days=1代表后一天,days=-1代表前一天,其他参数也一样。

from datetime import datetime, timedelta
 
now = datetime.now()
print(now + timedelta(weeks=10))  # 十周之后
print(now + timedelta(days=10))  # 十天之后
print(now + timedelta(hours=10))  # 十小时之后
print(now + timedelta(minutes=10))  # 十分钟之后
print(now + timedelta(seconds=10))  # 十秒之后
 
print(now + timedelta(weeks=-10))  # 十周之前
print(now + timedelta(days=-10))  # 十天之前
print(now + timedelta(hours=-10))  # 十小时之前
print(now + timedelta(minutes=-10))  # 十分钟之前
print(now + timedelta(seconds=-10))  # 十秒之前

三、Calendar模块

calendar模块提供了一些与日历相关的函数和类。它包含可打印的日历类,可以格式化周和月的天数,并将日历信息转换为不同的格式。基本上,calendar模块提供了一种将日期转换为特定格式的工具。它是纯Python的实现。

四、dateutil模块

dateutil模块是由Gustavo Niemeyer在2003年编写而成的对日期时间操作的第三方模块,对Python内置的datetime模块进行扩展时区和解析。

dateutil库主要有两个模块:parser和rrule,其中parser可以将字符串解析成datetime,而rrule则是根据定义的规则来生成datetime

dateutil模块特点:

能够计算日期时间相对增量,例如下周、下个月、明年、每月的最后一周等 可以计算两个给定日期和/或日期时间对象之间的相对增量 支持多种时区格式文件的解析,例如UTC时区、TZ时区等 支持包括RFC字符串或其他任何字符串格式的通用日期时间解析

官方文档:https://labix.org/python-dateutil

安装:pip install python-dateutil

4.1、dateutil库常用模块

dateutil库常用模块有三个:parser、rrule和relativedelta

dateutil.parser:将字符串解析成datetime dateutil.rrule:将参数输出datetime.datetime格式的时间 dateutil.relativedelta:日期时间偏移量

4.1.1、dateutil.parser

from dateutil import parser
 
# 没指定时间默认0点,没指定日期默认当天,没指定年份默认当年, 当年份放在前面时,只能按年月日的顺序
print(parser.parse('2024-08-08'))          # 2024-08-08 00:00:00
print(parser.parse('2024-07-08 10:45:52')) # 2024-12-24 10:55:55
print(parser.parse('20241224105555'))      # 2024-12-24 10:45:52
print(parser.parse('2024.10.10'))          # 2024-10-10 00:00:00
print(parser.parse('2007/09/15'))          # 2007-09-15 00:00:00
 
# fuzzy:开启模糊匹配,过滤无法识别的时间日期字符
print(parser.parse('Today is 11-29 10:45, I feel good.', fuzzy=True))   # 2024-11-29 10:45:00
 
# 当只有月日时,parser会将分隔符前面的数字解析为月份,后面的为日, 当有年份时,在前面的月份超出范围时,会自动判断哪个是月哪个是日
# 11.29解析结果异常,11-29、11/29可正常解析
print(parser.parse('11-29'))               # 2024-11-29 00:00:00
print(parser.parse('11/29/2023'))          # 2023-11-29 00:00:00
 
# 当前面的月份超过12时,parser会自动识别月和日
print(parser.parse('13/11/2023'))          # 2023-11-29 00:00:00
 
# 当分隔符为逗号时,只有月日时,要把月放在后面
# 当分隔符为逗号时,有年份时,年份要放在后面,要把月放在前面
print(parser.parse('29,11'))               # 2024-08-29 00:00:00
print(parser.parse('11,29,2024'))          # 2024-11-29 00:00:00
 
# 识别英文的月、日
print(parser.parse('November 29'))         # 2024-11-29 00:00:00
print(parser.parse('November 1st'))        # 2024-11-01 00:00:00
print(parser.parse('November 29 2023'))    # 2023-11-29 00:00:00
print(parser.parse('2023 November29'))     # 2023-11-29 00:00:00
print(parser.parse('11:45 AM'))            # 2024-11-29 11:45:00

4.1.2、dateutil.rrule()

rrule.rrule(freq, dtstart, interval, wkst, count, until, by)

freq:单位,可选的值为YEARLY、MONTHLY、WEEKLY、DAILY、HOURLY、MINUTELY、SECONDLY,即年月日周时分秒 dtstart、until:开始和结束时间,时间格式datetime.datatime类型 interval:间隔 wkst:周开始时间 count:生产时间的个数 by:指定匹配的周期,例如,byweekday=(MO,TU):只有周一周二的匹配,取值如下:
          - bysetpos:必须为整数或者整数序列,设置匹配的周期频率
          - bymonth:设置匹配的月份
          - bymonthday:设置匹配每月的日期
          - byyearday:设置匹配每年的天数
          - byweekno:设置匹配第几周
          - byweekday:MO,TU,WE,TH,FR,SA,SU
          - byhour:设置匹配小时
          - byminute:设置匹配分钟
          - bysecond:设置匹配秒数

from dateutil import parser, rrule
 
# 生成一个连续的日期列表
print(list(rrule.rrule(rrule.DAILY, dtstart=parser.parse('2024-01-01'), until=parser.parse('2024-01-03'))))
# 输出:[datetime.datetime(2024, 1, 1, 0, 0), datetime.datetime(2024, 1, 2, 0, 0), datetime.datetime(2024, 1, 3, 0, 0)]
 
# 生成一个间隔一天的连续的日期列表
print(list(rrule.rrule(rrule.DAILY, interval=2, dtstart=parser.parse('2024-01-01'), until=parser.parse('2024-01-05'))))
# 输出:[datetime.datetime(2024, 1, 1, 0, 0), datetime.datetime(2024, 1, 3, 0, 0), datetime.datetime(2024, 1, 5, 0, 0)]
 
# 只保留前3个元素
print(list(rrule.rrule(rrule.DAILY, count=3, dtstart=parser.parse('2024-01-01'), until=parser.parse('2024-01-10'))))
# 输出:[datetime.datetime(2024, 1, 1, 0, 0), datetime.datetime(2024, 1, 2, 0, 0), datetime.datetime(2024, 1, 3, 0, 0)]
 
# 只取周六和周日日期时间
print(list(rrule.rrule(rrule.DAILY, byweekday=(rrule.SA, rrule.SU), dtstart=parser.parse('2024-01-01'), until=parser.parse('2024-01-10'))))
# 输出:[datetime.datetime(2024, 1, 6, 0, 0), datetime.datetime(2024, 1, 7, 0, 0)]
 
# 以月为间隔,生成3个月
print(list(rrule.rrule(rrule.MONTHLY, count=3, dtstart=parser.parse('2024-01-01'))))
# 输出:[datetime.datetime(2024, 1, 1, 0, 0), datetime.datetime(2024, 2, 1, 0, 0), datetime.datetime(2024, 3, 1, 0, 0)]
 
# rrule可计算出两个datetime对象间相差的年月日等时间数量
print(rrule.rrule(rrule.DAILY, dtstart=parser.parse('20240101'), until=parser.parse('20240201')).count())    # 32
# 不足N个月的,按N个月计算;不满整月的,按N-1个月计算
print(rrule.rrule(rrule.MONTHLY, dtstart=parser.parse('20240101'), until=parser.parse('20240201')).count())  # 2

4.1.3、dateutil.relativedelta()

from dateutil import parser, rrule, relativedelta
 
# datetime.timedelta与relativedelta.relativedelta()
from datetime import datetime, timedelta
 
# timedelta仅支持:weeks、days、hours、minutes、seconds,不支持月、年
# datetime.timedelta()计算上周
print(datetime.strftime(datetime.now() - timedelta(weeks=1), '%Y-%m-%d'))   # 2024-08-20
# relativedelta.relativedelta()计算上周
print(datetime.strftime(datetime.now() - relativedelta.relativedelta(weeks=1), "%Y-%m-%d"))   # 2024-08-20
 
# 计算上月初、计算上N月初
print(datetime.strftime(datetime.now() - relativedelta.relativedelta(months=1), "%Y-%m-01"))   # 2024-07-01
# 计算上月末、计算上N月末
print(datetime.strftime(datetime.strptime(datetime.now().strftime('%Y-%m-01'), '%Y-%m-%d') - relativedelta.relativedelta(days=1), '%Y-%m-%d'))   # 2024-07-31

附件

附件1:中英文单词对照表

中英文单词对照表

中文英文(简称)中文英文(简称)中文英文
一月January(Jan)星期一‌Monday(Mon)毫秒milliseconds
二月February(Feb)星期二‌Tuesday(Tue)微秒microseconds
三月March(Mar)星期三‌Wednesday‌(Wed)时间元组的九个属性
四月April(Apr)星期四‌Thursday(Thu)tm_year(年)0000~9999
五月May(May)星期五‌Friday(Fri)tm_mon(月)1~12
六月June(Jun)星期六Saturday(Sat)tm_mday(日)1~31
七月July(Jul)星期天‌Sunday(Sun)tm_hour(时)0~23
八月August(Aug)weekstm_min(分)0~59
九月September(Sep)daystm_sec(秒)0~61(61是闰秒)
十月October(Oct)hourstm_wday(一周中的第几日)0~6(0是周一)
十一月November(Nov)minutestm_yday(一年中的第几天)1~366
十二月December(Dec)secondstm_isdst(是否是夏令时)1为是,0为不是 ,-1为未知,默认为-1

附件2:格式化时间参考表

格式化时间参考表

%aMon星期几的简写%pPM本地的AM或PM的等价显示
%AMonday星期几的全称%r5:21:43 PM12小时的时间
%bSep月份的简写%R17:21显示小时和分钟:hh:mm
%BSeptember月份的全称%S43十进制的秒数 (01 - 61)不是59,闰年秒占两秒
%cMon Sep 21 17:21:42 2020标准的日期的时间串%T17:21:43显示时分秒:hh:mm:ss
%C20年份的后两位数字%u1每周的第几天,星期一为第一天 (值从0到6,星期一为0)
%d21十进制表示的每月的第几天%U38每年的第几周,把星期日做为第一天(值从0到53)
%D09/21/20月/天/年%V39每年的第几周,使用基于周的年
%e21在两字符域中,十进制表示的每月的第几天%w1十进制表示的星期几(值从0到6,星期天为0)
%F2020-09-21年-月-日%W38每年的第几周,把星期一做为第一天(值从0到53)
%g20年份的后两位数字%x09/21/20标准的日期串
%G2020使用基于周的年%X17:21:43标准的时间串
%hSep简写的月份名%y20不带世纪的十进制年份(值从0到99)
%H1724小时制的小时%Y2020带世纪部分的十制年份
%I5第几个小时(12小时制,01 - 12)%z+0800时区
%j265十进制表示的每年的第几天%Z中国标准时间时区名称,如果不能得到时区名称则返回空字符
%m9十进制表示的月份%%%百分号
%M21十进制表示的分钟数

 到此这篇关于Python时间处理模块time和datetime详解的文章就介绍到这了,更多相关模块time和datetime详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文