Python 10-日期时间

本文详细介绍Python中datetime模块的使用方法,包括日期、时间、日期时间的处理,及时区与时差的相关操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python 10-日期时间

Python中,对日期和时间的操作,主要使用这3个内置模块: datetime 、 time 和 calendar

1、datetime 模块

datetime 模块提供用于处理日期和时间的类。

在支持日期时间数学运算的同时,实现的关注点更着重于如何能够更有效地解析其属性用于格式化输出和数据操作。

1.1、常量

序号名称
1datetime.MINYEAR
date 或者 datetime 对象允许的最小年份。 常量 MINYEAR 是 1 。
2datetime.MAXYEAR
date 或 datetime 对象允许最大的年份。常量 MAXYEAR 是 9999 。

1.2、相关类

序号名称
1class datetime.date
一个理想化的简单型日期,它假设当今的公历在过去和未来永远有效。
属性: year, month, and day。
2class datetime.time
一个独立于任何特定日期的理想化时间,它假设每一天都恰好等于 246060 秒。
包含属性: hour, minute, second, microsecond 和 tzinfo。
3class datetime.datetime
日期和时间的结合。
属性:year, month, day, hour, minute, second, microsecond, and tzinfo.
4**class datetime.timedelta
**表示两个 date 对象或者 time 对象,或者 datetime 对象之间的时间间隔,精确到微秒。
5**class datetime.tzinfo
**一个描述时区信息对象的抽象基类。
用来给 datetime 和 time 类提供自定义的时间调整概念(例如处理时区和/或夏令时)。
6class datetime.timezone
一个实现了 tzinfo 抽象基类的子类,用于表示相对于 世界标准时间(UTC)的偏移量。
  • 继承关系

    object
        |--timedelta
        |--tzinfo
            |--timezone
        |--time
        |--date
            |--datetime
    

1.2.1、日期类 class date

介绍

date 对象代表一个理想化历法中的日期(年、月和日),即当今的格列高利历向前后两个方向无限延伸。

公元 1 年 1 月 1日是第 1 日,公元 1 年 1 月 2 日是第 2 日,依此类推。

序号名称
1class datetime.date(year, month, day)
所有参数都是必要的。
参数必须是在下面范围内的整数:
◆ MINYEAR <= year <= MAXYEAR
◆ 1 <= month <= 12
◆ 1 <= 日期 <= 给定年月对应的天数
2date.min
最小的日期 date(MINYEAR, 1, 1) 。
3date.max
最大的日期 ,date(MAXYEAR, 12, 31)。
4classmethod date.today()
返回当前的本地日期。
5**classmethod date.fromisoformat(date_string)
**返回一个对应于以 YYYY-MM-DD 格式给出的 date_string 的 date 对象:
6**date.replace(year=self.year, month=self.month, day=self.day)
**返回一个具有同样值的日期,除非通过任何关键字参数给出了某些形参的新值。
7date.weekday()
返回一个整数代表星期几,星期一为0,星期天为6。
例如, date(2002, 12, 4).weekday() == 2,表示的是星期三。
8date.isoweekday()
返回一个整数代表星期几,星期一为1,星期天为7。
例如:date(2002, 12, 4).isoweekday() == 3,表示星期三。参见 weekday(), isocalendar()。
9date.isoformat()
返回一个以 ISO 8601 格式 YYYY-MM-DD 来表示日期的字符串
10date.ctime()
返回一个表示日期的字符串:
11date.strftime(format)
返回一个由显式格式字符串所指明的代表日期的字符串。
表示时、分或秒的格式代码值将为 0。
要获取格式指令的完整列表请参阅 strftime() 和 strptime() 的行为。
支持的运算:
运算结果:
date2 = date1 + timedeltadate2 等于从 date1 减去 timedelta.days 天。
date2 = date1 - timedelta计算 date2 的值使得 date2 + timedelta == date1
timedelta = date1 - date2此值完全精确且不会溢出
date1 < date2如果 date1 的时间在 date2 之前则认为 date1 小于 date2
示例
  • 计算距离生日的间隔

    >>> my_birthday = date(today.year,6,24)
    >>> my_birthday
    datetime.date(2021, 6, 24)
    
    >>> time_to_birthday = abs(my_birthday - today)
    >>> time_to_birthday.days
    1
    >>> birthday = today.replace(day=20,month=5)
    >>> birthday
    datetime.date(2021, 5, 20)
    
    >>> today
    datetime.date(2021, 6, 25)
    
    >>> time_to_birthday = abs(birthday - today)
    >>> time_to_birthday.days
    36
    

1.2.2、时间类 class time

介绍

一个 time 对象代表某日的(本地)时间,它独立于任何特定日期,并可通过 tzinfo 对象来调整。

序号名称
1class 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]
2time.min
早最的可表示 time, time(0, 0, 0, 0)。
3time.max
最晚的可表示 time, time(23, 59, 59, 999999)。
4time.tzinfo
作为 tzinfo 参数被传给 time 构造器的对象,如果没有传入值则为 None。
5time.fold
取值范围是 [0, 1]。 用于在重复的时间段中消除边界时间歧义。
6classmethod time.fromisoformat(time_string)
返回对应于 time.isoformat() 所提供的某种 time_string 格式的 time。 特别地,此函数支持以下格式的字符串: HH:MM[:SS[.fff[fff]]]]]
7time.replace(hour=self.hour, minute=self.minute,
second=self.second, microsecond=self.microsecond,
tzinfo=self.tzinfo, *, fold=0)

返回一个具有同样属性值的 time,除非通过任何关键字参数指定了某些属性值。
8time.isoformat(timespec=‘auto’)
返回表示为下列 ISO 8601 格式之一的时间字符串:
◆ HH:MM:SS.ffffff,如果 microsecond 不为 0
◆ HH:MM:SS,如果 microsecond 为 0
◆ HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]],如果 utcoffset() 不返回 None
◆ HH:MM:SS+HH:MM[:SS[.ffffff]],如果 microsecond 为 0 并且 utcoffset() 不返回 None
9time.strftime(format)
返回一个由显式格式字符串所指明的代表时间的字符串。
示例

使用 time 对象的例子:

>>> from datetime import time, tzinfo, timedelta
>>> class TZ1(tzinfo):
...     def utcoffset(self, dt):
...         return timedelta(hours=1)
...     def dst(self, dt):
...         return timedelta(0)
...     def tzname(self,dt):
...         return "+01:00"
...     def  __repr__(self):
...         return f"{self.__class__.__name__}()"
...
>>> t = time(12, 10, 30, tzinfo=TZ1())
>>> t
datetime.time(12, 10, 30, tzinfo=TZ1())
>>> t.isoformat()
'12:10:30+01:00'
>>> t.dst()
datetime.timedelta(0)
>>> t.tzname()
'+01:00'
>>> t.strftime("%H:%M:%S %Z")
'12:10:30 +01:00'
>>> 'The {} is {:%H:%M}.'.format("time", t)
'The time is 12:10.'

1.2.3 日期时间类 datetime

介绍

datetime 对象是包含来自 date 对象和 time 对象的所有信息的单一对象。

与 date 对象一样,datetime 假定当前的格列高利历向前后两个方向无限延伸;与 time 对象一样,datetime 假定每一天恰好有 3600*24 秒。

序号名称
1class datetime.datetime(
year, month, day,
hour=0, minute=0, second=0, microsecond=0,
tzinfo=None, *, fold=0)

year, month 和 day 参数是必须的,其他可选。
2classmethod datetime.today()
返回表示当前地方时的 datetime 对象,其中 tzinfo 为 None。
3classmethod datetime.now(tz=None)
返回表示当前地方时的 date 和 time 对象。
4classmethod datetime.utcnow()
返回表示当前 UTC 时间的 date 和 time,其中 tzinfo 为 None。
5classmethod datetime.fromtimestamp(timestamp, tz=None)
返回对应于 POSIX 时间戳例如 time.time() 的返回值的本地日期和时间。
6classmethod datetime.combine(date, time, tzinfo=self.tzinfo)
使用日期和时间返回一个新的 datetime 对象
7classmethod datetime.fromisoformat(date_string)
返回一个对应 datetime 对象。
8classmethod datetime.fromisocalendar(year, week, day)
返回以 year, week 和 day 值指明的 ISO 历法日期所对应的 datetime。
9classmethod datetime.strptime(date_string, format)
返回一个对应于 date_string,根据 format 进行解析得到的 datetime 对象。
10datetime.date()
返回具有同样 year, month 和 day 值的 date 对象。
11datetime.time()
返回具有同样 hour, minute, second, microsecond 和 fold 值的 time 对象。
12datetime.timetz()
返回具有同样 hour, minute, second, microsecond, fold 和 tzinfo 属性性的 time 对象。
13*datetime.replace(
year=self.year, month=self.month, day=self.day,
hour=self.hour, minute=self.minute, second=self.second,
microsecond=self.microsecond, tzinfo=self.tzinfo, , fold=0)
14datetime.astimezone(tz=None)
返回一个具有新的 tzinfo 属性 tz 的 datetime 对象
15datetime.weekday()
返回一个整数代表星期几,星期一为 0,星期天为 6。
16datetime.isoweekday()
返回一个整数代表星期几,星期一为 1,星期天为 7。
17datetime.isoformat(sep=‘T’, timespec=‘auto’)
返回一个以 ISO 8601 格式表示的日期和时间字符串:
18datetime.strftime(format)
返回一个由显式格式字符串所指明的代表日期和时间的字符串
支持的运算:
运算结果:
datetime2 = datetime1 + timedelta(1)
datetime2 = datetime1 - timedelta(2)
timedelta = datetime1 - datetime2(3)
datetime1 < datetime2比较 datetimedatetime。 (4)

1.2.4、时区 timezone 对象

介绍

timezone 类是 tzinfo 的子类,它的每个实例都代表一个以与 UTC 的固定时差来定义的时区。

此类的对象不可被用于代表某些特殊地点的时区信息,这些地点在一年的不同日期会使用不同的时差,或是在历史上对民用时间进行过调整。

序号名称
1class datetime.timezone(offset, name=None)
offset 参数必须指定为一个 timedelta 对象,表示本地时间与 UTC 的时差。
它必须严格限制于 -timedelta(hours=24) 和 timedelta(hours=24) 之间,否则会引发 ValueError。
2timezone.tzname(dt)
返回当 timezone 实例被构造时指定的固定值。
3timezone.utc
UTC 时区,timezone(timedelta(0))

1.2.5、timedelta 类对象

介绍

timedelta 对象表示两个 date 或者 time 的时间间隔。

序号名称
1class datetime.timedelta(
days=0, seconds=0, microseconds=0,
milliseconds=0, minutes=0, hours=0, weeks=0)

所有参数都是可选的并且默认为 0。 这些参数可以是整数或者浮点数,也可以是正数或者负数。
2timedelta.min
最小的 timedelta(-999999999).
3timedelta.max
最大的 timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999).
实例属性(只读):
属性
days-999999999 至 999999999 ,含999999999
seconds0 至 86399,包含86399
microseconds0 至 999999,包含999999
支持的运算:
运算结果:
t1 = t2 + t3t2t3 的和。 运算后 t1-t2 == t3 and t1-t3 == t2 必为真值。(1)
t1 = t2 - t3t2t3 的差。 运算后 t1 == t2 - t3 and t2 == t1 + t3 必为真值。 (1)(6)
t1 = t2 * i
t1 = i * t2
乘以一个整数。运算后假如 i != 0t1 // i == t2 必为真值。
t1 = t2 * f
t1 = f * t2
乘以一个浮点数,结果会被舍入到 timedelta 最接近的整数倍。 精度使用四舍五偶入奇不入规则。
f = t2 / t3总时间 t2 除以间隔单位 t3 (3)。 返回一个 float 对象。
t1 = t2 / f
t1 = t2 / i
除以一个浮点数或整数。 结果会被舍入到 timedelta 最接近的整数倍。 精度使用四舍五偶入奇不入规则。
t1 = t2 // i
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 对象的字符串表示形式,作为附带正规属性值的构造器调用。

Format Codes格式代码

以下列表显示了 1989 版 C 标准所要求的全部格式代码,它们在带有标准 C 实现的所有平台上均可用。

指令含义示例
%a当地工作日的缩写。Sun, Mon, …, Sat (en_US);So, Mo, …, Sa (de_DE)
%A本地化的星期中每日的完整名称。Sunday, Monday, …, Saturday (en_US);Sonntag, Montag, …, Samstag (de_DE)
%w以十进制数显示的工作日,其中0表示星期日,6表示星期六。0, 1, …, 6
%d补零后,以十进制数显示的月份中的一天。01, 02, …, 31
%b当地月份的缩写。Jan, Feb, …, Dec (en_US);Jan, Feb, …, Dez (de_DE)
%B本地化的月份全名。January, February, …, December (en_US);Januar, Februar, …, Dezember (de_DE)
%m补零后,以十进制数显示的月份。01, 02, …, 12
%y补零后,以十进制数表示的,不带世纪的年份。00, 01, …, 99
%Y十进制数表示的带世纪的年份。0001, 0002, …, 2013, 2014, …, 9998, 9999
%H以补零后的十进制数表示的小时(24 小时制)。00, 01, …, 23
%I以补零后的十进制数表示的小时(12 小时制)。01, 02, …, 12
%p本地化的 AM 或 PM 。AM, PM (en_US);am, pm (de_DE)
%M补零后,以十进制数显示的分钟。00, 01, …, 59
%S补零后,以十进制数显示的秒。00, 01, …, 59
%f以十进制数表示的微秒,在左侧补零。000000, 000001, …, 999999
%zUTC 偏移量,格式为 ±HHMM[SS[.ffffff]] (如果是简单型对象则为空字符串)。(空), +0000, -0400, +1030, +063415, -030712.345216
%Z时区名称(如果对象为简单型则为空字符串)。(空), UTC, EST, CST
%j以补零后的十进制数表示的一年中的日序号。001, 002, …, 366
%U以补零后的十进制数表示的一年中的周序号(星期日作为每周的第一天)。 在新的一年中第一个星期日之前的所有日子都被视为是在第 0 周。00, 01, …, 53
%W以十进制数表示的一年中的周序号(星期一作为每周的第一天)。 在新的一年中第一个第期一之前的所有日子都被视为是在第 0 周。00, 01, …, 53
%c本地化的适当日期和时间表示。Tue Aug 16 21:30:00 1988 (en_US);Di 16 Aug 21:30:00 1988 (de_DE)
%x本地化的适当日期表示。08/16/88 (None);08/16/1988 (en_US);16.08.1988 (de_DE)
%X本地化的适当时间表示。21:30:00 (en_US);21:30:00 (de_DE)
%%字面的 '%' 字符。%

为了方便起见,还包括了C89标准不需要的其他一些指令。这些参数都对应于ISO 8601日期值。

指令含义示例
%G带有世纪的 ISO 8601 年份,表示包含大部分 ISO 星期 (%V) 的年份。0001, 0002, …, 2013, 2014, …, 9998, 9999
%u以十进制数显示的 ISO 8601 星期中的日序号,其中 1 表示星期一。1, 2, …, 7
%V以十进制数显示的 ISO 8601 星期,以星期一作为每周的第一天。 第 01 周为包含 1 月 4 日的星期。01, 02, …, 53

这些代码可能不是在所有平台上都可与 strftime() 方法配合使用。

示例

示例代码来自 :日期和时间 | 白月黑羽 (python3.vip)

获取当前时间对应的数字

开发程序时,经常需要获取两个代码位置在执行时的时间差,比如,我们想知道某个函数执行大概耗费了多少时间,就可以使用time.time()来做。

import time

before = time.time()
func1()
after = time.time()

print(f"调用func1,花费时间{after-before}")

time.time() 会返回 从 1970年1月1日0点(所谓的epoch时间点) 到 当前时间的 经过的秒数 ,可以简称为秒数时间。

指定格式字符串显示时间

以指定格式字符串显示时间,是非常常用的,比如日志里面的时间戳。

要得到 当前时间 对应的字符串,可以这样实现:

from datetime import datetime
str(datetime.now())

得到类似这样的字符串:‘2018-06-30 23:10:08.911420’

如果要指定输出的时间格式,可以像下面这样

datetime.now().strftime('%Y-%m-%d ** %H:%M:%S')

得到类似这样的字符串: ‘2019-02-24 ** 16:56:55’

当然,也可以使用time库来格式化显示字符串

time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()) 

数字表示的时间转化为字符串表示

如果要将某个指定秒数时间(从epoch时间点开始计算),而不是当前时间,转化为字符串格式,可以这样写

time.strftime('%Y%m%d %H:%M:%S',time.localtime(1434502529)) 

字符串时间转化为整数时间

反过来,如果要将字符串指定的时间,转化为秒数时间,可以这样

int(time.mktime(time.strptime('2015-08-01 23:59:59', '%Y-%m-%d %H:%M:%S')))

ISO格式 转化为 本地时间

有的时候,我们的程序获取的时间是 ISO 8601 格式的字符串。

比如:

2008-09-03T20:56:35.450686+00:002008-09-03T20:56:35.450686Z

可以通过如下方法转化为 本地格式

from datetime import  timezoneimport dateutil.parser# 字符串时间 转化为 datetime 对象dt = dateutil.parser.isoparse('2008-09-03T20:56:35.450686+00:00')# 根据时区 转化为 datetime 数据localdt = dt.replace(tzinfo=timezone.utc).astimezone(tz=None)# 产生本地格式 字符串localdt.strftime('%Y-%m-%d %H:%M:%S')

获取某个时间 对应 的年月日时分秒数字

要获取 当前时间 的 年、月、日、时、分、秒、星期几 对应的数字,可以使用datetime库

>>> from datetime import datetime>>> datetime.now()datetime.datetime(2018, 6, 30, 23, 3, 54, 238947)# 年>>> datetime.now().year2018# 月>>> datetime.now().month6# 日>>> datetime.now().day30# 时>>> datetime.now().hour23# 分>>> datetime.now().minute7# 秒>>> datetime.now().second58# 毫秒>>> datetime.now().microsecond151169# 获取星期几用 weekday方法# 0 代表星期一,1 代表星期二 依次类推>>> datetime.now().weekday() 5

获得指定时间字符串对应星期几

如果要获取的是 某个指定时间,比如 “2018-6-24”,而不是当前时间,对应的星期几,怎么办?

可以使用 datetime类的 strptime方法,先产生对应的 datetime对象

# 要计算出 2018年6月24日 是星期几 thatDay = "2018-6-24"from datetime import datetime# 先把字符串表示的日期转化为 datetime 对象theDay = datetime.strptime(thatDay, "%Y-%m-%d")#再获取星期几theDay.weekday()  

从某个时间点往前或者后推 一段时间

如果我们想知道,2018年6月24日 往后推120天,是什么日期?星期几?

往前推120天,又是什么日期?星期几?

可以这样计算

thatDay = "2018-6-24"from datetime import datetime,timedeltatheDay = datetime.strptime(thatDay, "%Y-%m-%d").date()# 后推120天 就是 + timedelta(days=120)target = theDay + timedelta(days=120)print(target)print(target.weekday())# 前推120天 就是 - timedelta(days=120)target = theDay - timedelta(days=120)print(target)print(target.weekday())

获得指定日期那周的周一

thatDay = "2018-6-30"from datetime import datetime,timedeltatheDay = datetime.strptime(thatDay, "%Y-%m-%d").date()# 这就是 2018-6-30 那一周的周一weekMonday = theDay - timedelta(days=theDay.weekday())

获取某个月总共有多少天

最方便的方法是使用 calendar 模块里面的 函数

from calendar import monthrange# monthrange返回的是元组# 第一个元素是指定月第一天是星期几# 第二个元素是指定月有多少天mr = monthrange(2011, 2)# 得到2011年2月有多少天print(mr[1])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值