python datetime模块

本文介绍Python的datetime模块,是python常用的处理日期和时间的模块。
笔者也介绍了和datetime模块相关的time模块calendar模块,学习本模块之前最好先学习time模块。

一、初识datetime

datetime模块包含六个类和两个常量。
六个类分别是:

  • date:表示日期(年 月 日)
  • time:表示时间(时 分 秒 微秒)
  • datetime:表示日期和时间 (年 月 日 时 分 秒 微秒)
  • timedelta:表示时间间隔(日 秒 微秒)
  • datetime_CAPI:表示日期时间对象C语言接口
  • tzinfo:表示时区信息
    两个常量分别是:
  • MAXYEAR:能表示的最大年份,等于9999
  • MINYEAR:能表示的最小年份,等于1

本文不介绍datetime_CAPItzinfo两个类。

二、date类

date类由年份、月份和日期三部分构成,包含yearmonthday三个仅读的表示具体日期的属性,定义如下:

class datetime.date(year, month, day)

其中:
MINYEAR <= year <= MAXYEAR
1 <= month <= 12
1 <= day <= 给定年月对应的天数

1. 访问date对象的属性

date对象有六个属性,分别是:yearmonthdayresolutionmaxmin

  1. 我们可以直接访问date对象的三个表示具体日期的属性(year, month, day),如下:
    >>> import datetime
    >>> a = datetime.date(2021, 2, 27)
    >>> print(a.year, a.month, a.day)
    2021 2 27
    
  2. resolution返回date对象表示日期的最小单位为1天(day)
    >>> a.resolution
    datetime.timedelta(1)
    
  3. max表示date类能表示的最大的年、月、日的数值,自身也是一个date对象
    >>> a.max
    datetime.date(9999, 12, 31)
    
  4. min表示date类能表示的最小的年、月、日的数值,自身也是一个date对象
    >>> a.min
    datetime.date(1, 1, 1)
    

2. date类的构造方法

date有四种构造方法,这里介绍常用的三种:

import datetime
import time
a = datetime.date(2021, 2, 27) # 根据给定参数构造date对象
b = datetime.date.today() # 使用当前日期构造date对象
c = datetime.date.fromtimestamp(time.time()) # 根据给定的时间戳构造date对象
d = datetime.date.fromisoformat('2021-02-27') # 根据ISO标准的时间字符串构造date对象

上述代码中的datetime.date.today()方法、datetime.date.fromtimestamp()datetime.date.fromisoformat()方法都是使用@classmethod修饰符的静态方法,返回类型为date类。

3. date类的日期比较方法

用于日期比较的方法如下:

方法__eq__(..)__ne__(..)__ge__(..)__gt__(..)__le__(..)__lt__(..)
说明等于不等于大于等于大于小于等于小于

示例如下:

>>> a = datetime.date(2021, 2, 27)
>>> b = datetime.date(2021, 2, 28)
>>> a.__eq__(b)
False
>>> a.__ne__(b)
True
>>> a.__ge__(b)
False
>>> a.__gt__(b)
False
>>> a.__le__(b)
True
>>> a.__lt__(b)
True

4. 获取两个date相差多少天

方法如下:

方法__sub__(..)__rsub__(..)
用法x.__sub__(y)x.__rsub__(y)
说明x - yy - x

两个方法的返回值都是datetime.timedelta对象,下文会介绍。
示例如下:

>>> a = datetime.date(2021, 2, 27)
>>> b = datetime.date(2021, 2, 28)
>>> a.__sub__(b)
datetime.timedelta(-1)
>>> a.__rsub__(b)
datetime.timedelta(1)

5. 格式化日期

  1. date.__str__()获取日期的字符串
    >>> a.__str__()
    '2021-02-27'
    
  2. date.ctime()获取ctime样式的字符串
    >>> a.ctime()
    'Sat Feb 27 00:00:00 2021'
    
  3. date.__format__(..)以指定格式进行日期输出,此方法等价于date.strftime(..)方法,指定方式参考time模块第二章4.2节
    >>> a.__format__("%Y-%m-%d")
    '2021-02-27'
    >>> a.strftime("%Y-%m-%d")
    '2021-02-27'
    
  4. ISO标准化日期
    1. date.isocalendar()获取一个包含三个值的元组,三个值分别是:year年份、week number周数、weekday星期数(周一为1 … 周日为7)
    2. date.isoformat()返回符合ISO 8601标准(YYYY-MM-DD)的日期字符串
    3. date.isoweekday()返回符合ISO标准的指定日期的星期数 (周一为1 … 周日为7)
      示例如下:
    >>> a.isocalendar()
    (2021, 8, 6)
    >>> a.isoformat()
    '2021-02-27'
    >>> a.isoweekday()
    6
    

6. 其他方法

  1. date.weekday()返回指定日期的星期数,和date.isoweekday()的区别在于date.weekday()默认周一为0而date.isoweekday()默认周一为1
    >>> a.weekday()
    5
    >>> a.isoweekday()
    6
    
  2. date.timetuple()返回当前日期的time.struct_time格式,time.struct_time中有关时间部分的属性置为0
    >>> a.timetuple()
    time.struct_time(tm_year=2021, tm_mon=2, tm_mday=27, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=58, tm_isdst=-1)
    
  3. date.toordinal()返回公元公历开始到指定日期的天数。公元1年1月1日为1
    >>> a.toordinal()
    737848
    
  4. date.replace()返回一个替换指定日期部分字段的新date对象,不影响原对象
    >>> b = a.replace(2021, 3, 30)
    >>> a
    datetime.date(2021, 2, 27)
    >>> b
    datetime.date(2021, 3, 30)
    

三、time类

time类由小时、分钟、秒和微秒四部分构成,包含hourminutesecondmicrosecondtzinfo五个表示时间的属性,本文只关注前四个仅读属性,定义如下:

class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

所有参数都是可选的,其中:
0 <= hour < 24
0 <= minute < 60
0 <= second < 60
0 <= microsecond < 1000000
fold in [0, 1]

1. 访问time对象的属性

time对象总共有九个属性,分别是:hourminutesecondmicrosecondresolutionmaxmintzinfofold,本文不关注tzinfofold

  1. 我们可以直接访问time对象的四个表示具体时间的属性,如下:
    >>> import datetime
    >>> t = datetime.time(14, 57, 23, 1000)
    >>> print(t.hour, t.minute, t.second, t.microsecond)
    14 57 23 1000
    
  2. resolution返回time对象表示时间的最小单位为1微秒(microsecond)
    >>> t.resolution
    datetime.timedelta(0, 0, 1)
    
  3. max表示time类能表示的最大的时间数值,自身也是一个time对象
    >>> t.max
    datetime.time(23, 59, 59, 999999)
    
  4. min表示time类能表示的最小的时间数值,自身也是一个time对象
    >>> t.min
    datetime.time(0, 0)
    

2. time类的构造方法

time有两种常用的构造方法:

import datetime
t = datetime.time(14, 57, 23, 1000) # 根据给定参数构造time对象
u = datetime.time.fromisoformat('00:05:23.283') # 根据ISO标准的时间字符串构造time对象

3. time类的日期比较方法

time类用于时间比较的方法和date相似,如下:

方法__eq__(..)__ne__(..)__ge__(..)__gt__(..)__le__(..)__lt__(..)
说明等于不等于大于等于大于小于等于小于

4. 格式化日期

  1. time.__str__()获取时间的字符串
    >>> t.__str__()
    '14:57:23.001000'
    
  2. time.__format__(..)以指定格式进行时间输出,此方法等价于date.strftime(..)方法,指定方式参考time模块第二章4.2节
    >>> t.__format__('%H:%M:%S:%f')
    '14:57:23:001000'
    >>> t.strftime('%H:%M:%S:%f')
    '14:57:23:001000'
    
  3. time.isoformat()以ISO 8601格式输出时间字符串
    >>> t.isoformat()
    '14:57:23.001000'
    

四、datetime类

datetime类可以看做是date类和time类的合体,由年份、月份、日期、小时、分钟、秒和微秒七部分构成,包含yearmonthdayhourminutesecondmicrosecondtzinfo八个表示时间的属性,本文只关注前七个仅读属性,定义如下:

class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

yearmonthday参数是必须的,其他参数都是可选的,其中:
MINYEAR <= year <= MAXYEAR
1 <= month <= 12
1 <= day <= 指定年月的天数
0 <= hour < 24
0 <= minute < 60
0 <= second < 60
0 <= microsecond < 1000000
fold in [0, 1]

1. 访问datetime对象的属性

datetime对象有十二个属性,分别是:yearmonthdayhourminutesecondmicrosecondresolutionmaxmintzinfofold,本文不关注tzinfofold。。

  1. 我们可以直接访问datetime对象的三个表示具体日期的属性(year, month, day),如下:
    >>> import datetime
    >>> a = datetime.datetime(2021, 2, 27, 14, 57, 23, 124575)
    >>> print(a.year, a.month, a.day, a.hour, a.minute, a.second, a.microsecond)
    2021 2 27 14 57 23 124575
    
  2. resolution返回datetime对象表示表示时间的最小单位为1微秒(microsecond)
    >>> a.resolution
    datetime.timedelta(0, 0, 1)
    
  3. max表示datetime类能表示的最大的年、月、日、时、分、秒、微秒的数值,自身也是一个datetime对象
    >>> a.max
    datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)
    
  4. min表示datetime类能表示的最小的年、月、日、时、分、秒、微秒的数值,自身也是一个datetime对象
    >>> a.min
    datetime.datetime(1, 1, 1, 0, 0)
    

2. datetime类的构造方法

datetime有多种构造方法,这里介绍常用的几种:

import datetime
import time
a = datetime.datetime(2021, 2, 27, 14, 57, 23, 124575) # 根据给定参数构造datetime对象
b = datetime.datetime.today() # 使用当前时间构造datetime对象
c = datetime.datetime.now() # 等价于datetime.datetime.today()
d = datetime.datetime.fromtimestamp(time.time()) # 根据给定的时间戳构造datetime对象
e = datetime.datetime.fromisoformat('2011-11-04 00:05:23.283258') #  # 根据ISO标准的时间字符串构造datetime对象
f = datetime.datetime.strptime('2021-2-27 15:25', '%Y-%m-%d %H:%M') # 根据给定的时间字符串和格式说明构造datetime对象

3. datetime类的时间比较方法

datetime类用于时间比较的方法和date、time都相似,如下:

方法__eq__(..)__ne__(..)__ge__(..)__gt__(..)__le__(..)__lt__(..)
说明等于不等于大于等于大于小于等于小于

4. 格式化时间

datetime用于输出格式化时间的方法和date相似,不再单独介绍。

5. 其他方法

datetime对象的weekday()方法、timetuple()方法、replace()方法及toordianl()方法都和date对象用法相同,不再介绍,下面介绍datetime特有的方法。

  1. date()方法返回datetime对象的日期部分
    >>> a.date()
    datetime.date(2021, 2, 27)
    
  2. time()方法返回datetime对象的时间部分
    >>> a.time()
    datetime.time(14, 57, 23, 124575)
    
  3. combine(..)将一个date对象和一个time对象合并为一个datetime对象
    >>> a = datetime.date.today()
    >>> b = datetime.time(14, 57, 23, 121547)
    >>> datetime.datetime.combine(a, b)
    datetime.datetime(2021, 2, 28, 14, 57, 23, 121547)
    

五、timedelta类

timedelta对象表示两个date对象或者两个datetime对象之间的时间间隔,由天数、秒数、微秒数三部分构成,dayssecondsmicroseconds三个用于表示时间间隔的属性,定义如下:

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

其中,milliseconds参数、minutes参数、hours参数和weeks参数会按如下换算规则转换为dayssecondsmicroseconds
1 millisecond(毫秒)= 1000 microseconds(微秒)
1 minute = 60 seconds
1 hour = 3600 seconds
1 week = 7 days
并且最终得到的dayssecondsmicroseconds会经标准化处理以保证表达方式的唯一性,即:
0 <= microseconds < 1000000(一秒的微秒数)
0 <= seconds < 3600*24 (一天的秒数)
-999999999 <= days <= 999999999
示例如下:

>>> import datetime
>>> delta = datetime.timedelta(
...     days=50,
...     seconds=27,
...     microseconds=10,
...     milliseconds=29000,
...     minutes=5,
...     hours=8,
...     weeks=2
... )
>>> delta
datetime.timedelta(64, 29156, 10)

上述示例中,所有参数首先换算为dayssecondsmicroseconds
d a y s = d a y s + w e e k s ∗ 7 = 64 , s e c o n d s = s e c o n d s + m i n u t e s ∗ 60 + h o u r s ∗ 60 ∗ 60 = 29127 , m i c r o s e c o n d s = m i c r o s e c o n d s + m i l l i s e c o n d s ∗ 1000 = 29000010 days = days + weeks * 7 = 64, \\ seconds = seconds + minutes * 60 + hours * 60 * 60 = 29127, \\ microseconds = microseconds + milliseconds * 1000 = 29000010 days=days+weeks7=64,seconds=seconds+minutes60+hours6060=29127,microseconds=microseconds+milliseconds1000=29000010
在经过标准化处理:
m i c r o s e c o n d s = m i c r o s e c o n d s − 1000000 ∗ 29 = 10 , s e c o n d s = s e c o n d s + 29 − 3600 ∗ 24 ∗ 0 = 29156 , d a y s = d a y s + 0 = 64 microseconds = microseconds - 1000000 * 29 = 10, \\ seconds = seconds + 29 - 3600 * 24 * 0 = 29156, \\ days = days + 0 = 64 microseconds=microseconds100000029=10,seconds=seconds+293600240=29156,days=days+0=64

1. 访问timedelta对象的属性

timedelta对象有六个属性,分别是:dayssecondsmicrosecondsresolutionmaxmin

  1. 我们可以直接访问timedelta对象的三个表示时间间隔的属性(dayssecondsmicroseconds),如下:
    >>> print(delta.days, delta.seconds, delta.microseconds)
    64 29156 10
    
  2. resolution返回两个不相等的timedelta对象的最小间隔为1微秒(microseconds),自身也是一个timedelta对象
    >>> delta.resolution
    datetime.timedelta(0, 0, 1)
    
  3. max表示timedelta类能表示的最大时间间隔,自身也是一个timedelta对象
    >>> delta.max
    datetime.timedelta(999999999, 86399, 999999)
    
  4. min表示timedelta类能表示的最小时间间隔,自身也是一个timedelta对象
    >>> delta.min
    datetime.timedelta(-999999999)
    

2. timedelta类的构造方法

timedelta类只采用直接构造方法,上文已有举例,不再说明。

3. timedelta类的用法

timedelta类支持date对象、datetime对象和timedelta对象之间的加、减、乘、除、求余等操作,下面是一个用法示例:

# 求3天3小时30秒之前的日期时间
>>> now = datetime.datetime.now()
>>> delta = datetime.timedelta(days=3, hours=3, seconds=30)
>>> now - delta
datetime.datetime(2021, 2, 26, 6, 21, 59, 861377)

更多的计算方式参考python官网

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值