Python datetime 模块

datetime 模块常量:

datetime.MINYEAR:date 和 datetime 对象中允许的最小年份。MINYEAR 为 1。

datetime.MAXYEAR:date 和 datetime 对象中允许的最大年份数。MAXYEAR 为 9999。

子类关系:

object
    timedelta
    tzinfo
        timezone
    time
    date
        datetime

time 时间

一个独立于任何特定的日子,假设每天有 24 \* 60 \* 60 秒(这里没有“闰秒”的概念)。属性:hourminutesecondmicrosecondtzinfo

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

所有参数都是可选的。tzinfo 可以是 None 或 tzinfo 子类的实例。其余的参数可以是以下范围内的整数:

  • 0 <= hour < 24
  • 0 <= minute < 60
  • 0 <= second < 60
  • 0 <= microsecond < 1000000.

类属性

>>> import datetime
>>> datetime.time.min  # 最早的 time
datetime.time(0, 0)
>>> datetime.time.max  # 最晚的 time
datetime.time(23, 59, 59, 999999)

>>> datetime.time.resolution  # 不相等的 time 对象之间的最小可能差 1 微秒
datetime.timedelta(0, 0, 1)
>>> print(datetime.time.resolution)
0:00:00.000001

实例属性(只读)

>>> t = datetime.time(1, 2, 3)
>>> t.hour
1
>>> t.minute
2
>>> t.second
3
>>> t.microsecond
0
>>> t.tzinfo  # None
>>>

实例方法

>>> t = datetime.time(1, 2, 3)
>>> t.isoformat()  # 返回格式 HH:MM:SS.mmmmmm 表示的字符串,如果 microsecond 为 0,则以 HH:MM:SS 的格式。
'01:02:03'
>>> t.__str__()  # 等同于 t.isoformat()
'01:02:03'

>>> t.strftime('%H')  # 返回一个表示 time 的指定格式字符串,
'01'
>>> t.__format__('%H')  # 与 time.strftime() 相同
'01'

# time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]])
>>> t.replace(2)  # 返回具有相同值的 time
datetime.time(2, 2, 3)
>>> t
datetime.time(1, 2, 3)
>>> t.replace()
datetime.time(1, 2, 3)

date 日期

class datetime.date(year, month, day)

所有参数都是必需的。参数可以是以下范围内的整数:

  • MINYEAR <= year <= MAXYEAR
  • 1 <= month <= 12
  • 1 <= day <= 给定年下给定月份中的天数

类方法

>>> datetime.date.today()  # 返回当前的本地日期。这相当于date.fromtimestamp(time.time())。
datetime.date(2019, 1, 26)

>>> datetime.date.fromtimestamp(time.time())
datetime.date(2019, 1, 26)

>>> datetime.date.today().toordinal()
737085
>>> datetime.date.fromordinal(1)  # 返回对应于格雷高尔顺序的日期,其中第1年的1月1有序号1。
datetime.date(1, 1, 1)
>>> datetime.date.fromordinal(737085)  # 对于任何日期d,date.fromordinal(d.toordinal()) == d。
datetime.date(2019, 1, 26)

类属性

>>> datetime.date.min  # 可表示的最早日期
datetime.date(1, 1, 1)
>>> datetime.date.max  # 可表示最晚的日期
datetime.date(9999, 12, 31)
>>> datetime.date.resolution  # 不相等的日期对象之间的最小可能差异
datetime.timedelta(1)

实例属性(只读)

d = datetime.date.today()
>>> d.year
2019
>>> d.month
1
>>> d.day
26

实例方法

>>> d.replace(day=27)  # 返回一个日期
datetime.date(2019, 1, 27)

>>> d.timetuple()  # 返回一个time.struct_time,类似time.localtime()的返回值。
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=26, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=26, tm_isdst=-1)
>>> yday = d.toordinal() - datetime.date(d.year, 1, 1).toordinal() + 1
>>> time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))  # 等同于 d.timetuple()
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=26, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=26, tm_isdst=-1)

>>> d.toordinal()  # 返回该日期的预测格里历序号
737085
>>> datetime.date.fromordinal(d.toordinal()) == d
True

>>> d.weekday()  # 将星期几作为整数返回,其中星期一为0,星期日为6。
5
>>> d.isoweekday()  # 将星期几作为整数返回,其中星期一为1,星期日为7。
6
>>> d.isocalendar()  # 返回3元组(ISO年,ISO周编号,ISO工作日)。
(2019, 4, 6)
# ISO年包括52或53个整周,其中一周从星期一开始并在星期日结束。ISO年的第一周是一年的第一个包含星期四的(公历)日历周。这称为周数1,该周四的ISO年与其公历年相同。
# 例如,2004年从星期四开始,因此ISO 2004年的第一周从2003年12月29日星期一开始,2004年1月4日星期日结束
# 因此 date(2003, 12, 29).isocalendar() == (2004, 1, 1) 以及 date(2004, 1, 4).isocalendar() == (2004, 1, 7)。

>>> d.isoformat()  # 以ISO 8601格式返回表示日期的字符串'YYYY-MM-DD'
'2019-01-26'
>>> d.__str__()  # 等同于d.isoformat()。
'2019-01-26'

>>> d.ctime()  # 返回表示日期的字符串
'Sat Jan 26 00:00:00 2019'
>>> time.ctime(time.mktime(d.timetuple()))  # 等效于 d.ctime()
'Sat Jan 26 00:00:00 2019'

>>> d.strftime('%Y年%m月%d日')  # 返回一个表示日期的字符串
'2019年01月26日'
>>> d.__format__('%Y年%m月%d日')  # 与 date.strftime() 相同。
'2019年01月26日'

timedeltas 时间差

timedelta 对象表示两个 date、time 或 datetime 实例之间相差的时间,分辨率达到微秒。

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

所有参数都是可选的且默认为0。参数可以是整数或浮点数,也可以是正数或负数。

只有days(天),seconds(秒)和microseconds(微秒)存储在内部。参数被转换为这些单位:

  • 1毫秒转换为1000微秒。
  • 1分钟转换为60秒。
  • 1小时转换为3600秒。
  • 1周被转换为7天。

然后对天,秒和微秒进行归一化,以便表示是唯一的

  • 0 <= microseconds < 1000000
  • 0 <= seconds < 3600*24(一天中的秒数)
  • -999999999 <= days <= 999999999

类属性

>>> from datetime import timedelta
>>> timedelta.min  # 最小的 timedelta 对象
datetime.timedelta(-999999999)
>>> timedelta.max  # 最大的 timedelta 对象,timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)
datetime.timedelta(999999999, 86399, 999999)
>>> timedelta.resolution  # 不相等的 timedelta 对象之间的最小可能差值 timedelta(microseconds=1)
datetime.timedelta(0, 0, 1)

实例属性(只读)

>>> t = timedelta.max
>>> t.days
999999999
>>> t.seconds
86399
>>> t.microseconds
999999

支持的操作

>>> t2 = timedelta(1)
>>> t2
datetime.timedelta(1)
>>> t3 = timedelta(0,1)
>>> t3
datetime.timedelta(0, 1)
>>> t2 + t3  # t2 和 t3 的和
datetime.timedelta(1, 1)
>>> t2 - t3  # t2 和 t3 的差
datetime.timedelta(0, 86399)
>>> t2 * 2  # 乘以一个整数
datetime.timedelta(2)
>>> t2 * 1.1  # 乘以一个浮点数,结果使用 round-half-to-even 舍入到 timedelta.resolution 最近的倍数
datetime.timedelta(1, 8640)
>>> t2 / t3  # t2 除以 t3。返回一个 float 对象。
86400.0
>>> t2 / 2  # 除以一个浮点数或整数
datetime.timedelta(0, 43200)
>>> t2 // 2  # 计算商,余数被丢弃
datetime.timedelta(0, 43200)
>>> t2 // t3  # 计算商,返回一个整数
86400
>>> t2 % t3  # 计算余数
datetime.timedelta(0)
>>> divmod(t3, t2)  # 计算商和余数:q = t1 // t2 且 r = t1 % t2。q一个是整数,r是一个timedelta对象。
(0, datetime.timedelta(0, 1))
>>> -t2  # 等效于 timedelta(-t1.days, -t1.seconds, -t1.microseconds),和 t1* -1。
datetime.timedelta(-1)
>>> abs(t2)  # 当 t.days >= 0 时等效于 +t,当 t.days < 0 时等效于 -t
datetime.timedelta(1)
>>> str(t2)
'1 day, 0:00:00'
>>> repr(t2)
'datetime.timedelta(1)'

实例方法

>>> t2.total_seconds()  # 返回持续时间中包含的总秒数。等同于 t2 / timedelta(seconds=1)。
86400.0

日期算术运算

>>> today = datetime.date.today()
>>> one_day = datetime.timedelta(days=1)
>>> yesterday = today - one_day  # 日期减一天
>>> tomorrow = today + one_day  # 日期加一天
>>> yesterday
datetime.date(2019, 1, 26)
>>> tomorrow
datetime.date(2019, 1, 28)
>>> tomorrow - yesterday  # 日期实例之间相减会产生时间差
datetime.timedelta(2)
>>> yesterday - tomorrow
datetime.timedelta(-2)

比较数值

日期值和时间值都可以使用标准比较运算符进行比较,以确定哪个值更早或更晚。

>>> t1 = datetime.time(12, 55, 0)
>>> t1
datetime.time(12, 55)
>>> t2 = datetime.time(13, 5, 0)
>>> t2
datetime.time(13, 5)
>>> t1 < t2
True

>>> d1 = datetime.date.today()
>>> d1
datetime.date(2019, 1, 27)
>>> d2 = datetime.date.today() + datetime.timedelta(days=1)
>>> d2
datetime.date(2019, 1, 28)
>>> d1 > d2
False

datetime 日期与时间

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

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

年,月和日的参数是必需的。tzinfo 可以是 None 或 tzinfo 子类的实例。其余的参数可以是以下范围内的整数:

  • MINYEAR <= year <= MAXYEAR
  • 1 <= month <= 12
  • 1 <= day <= 给定年下给定月份中的天数
  • 0 <= hour < 24
  • 0 <= minute < 60
  • 0 <= second < 60
  • 0 <= microsecond < 1000000

类方法

>>> from datetime import datetime
>>> datetime.today()  # 返回当前本地日期时间,相当于 datetime.fromtimestamp(time.time())
datetime.datetime(2019, 1, 27, 13, 58, 55, 518472)
>>> datetime.now()  # 返回当前的本地日期和时间。如果可选参数 时区tz 为 None 或未指定,则这类似于 today()
datetime.datetime(2019, 1, 27, 13, 59, 6, 547804)
>>> datetime.utcnow()  # 返回当前 UTC 日期和时间
datetime.datetime(2019, 1, 27, 5, 59, 18, 215222)

>>> datetime.fromtimestamp(time.time())  # 返回与时间戳对应的本地日期和时间
datetime.datetime(2019, 1, 27, 13, 59, 35, 268036)
>>> datetime.utcfromtimestamp(time.time())  # 返回与时间戳对应的 UTC datetime
datetime.datetime(2019, 1, 27, 5, 59, 59, 106960)

>>> datetime.now().toordinal()  # 实例方法,获得对应于普通公历的序数
737086
>>> datetime.fromordinal(737086)  # 返回对应于普通公历的序数的 datetime
datetime.datetime(2019, 1, 27, 0, 0)

>>> d = datetime.now()
>>> datetime.combine(d.date(), d.timetz())  # 根据 date time 对象返回一个 datetime 对象
datetime.datetime(2019, 1, 27, 14, 9, 37, 908094) # 等同于 d
>>> from datetime import date
>>> from datetime import time
>>> datetime.combine(date(2017,1,1), time(1))
datetime.datetime(2017, 1, 1, 1, 0)

>>> datetime.strptime('20180101', '%Y%m%d')
datetime.datetime(2018, 1, 1, 0, 0)

类属性

>>> datetime.min  # 可表示的最早 datetime
datetime.datetime(1, 1, 1, 0, 0)  # 可表示的最晚 datetime
>>> datetime.max
datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)
>>> datetime.resolution  # 不相等的 datetime 对象之间的最小可能差值
datetime.timedelta(0, 0, 1)

实例属性(只读)

>>> d = datetime.now()
>>> d.year
2019
>>> d.month
1
>>> d.day
27
>>> d.hour
14
>>> d.minute
22
>>> d.second
21
>>> d.microsecond
17905
>>> d.tzinfo
>>>

实例方法

>>> d = datetime.now()
>>> d.date()  # 返回具有相同年、月和日的date对象。
datetime.date(2019, 1, 27)
>>> d.time()  # 返回具有相同小时、分钟、秒和微秒的 time 对象
datetime.time(14, 22, 21, 17905)
>>> d.timetz()  # 返回具有相同小时、分钟、秒、微秒和 tzinfo 属性的 time 对象。
datetime.time(14, 22, 21, 17905)

>>> d.replace(2020)  # [year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]]
datetime.datetime(2020, 1, 27, 14, 22, 21, 17905)

>>> d.astimezone(tz=None)  # 返回带有新 tzinfo 属性 tz(默认本地地区) 的 datetime 对象
datetime.datetime(2019, 1, 27, 14, 22, 21, 17905, tzinfo=datetime.timezone(datetime.timedelta(0, 28800), '中国标准时间'))
>>> dd = d.astimezone()
>>> dd.tzname()
'中国标准时间'

>>> d.timetuple()  # 返回一个 time.struct_time,类似 time.localtime() 的返回值。
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=27, tm_hour=14, tm_min=22, tm_sec=21, tm_wday=6, tm_yday=27, tm_isdst=-1)
>>> d.utctimetuple()
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=27, tm_hour=14, tm_min=22, tm_sec=21, tm_wday=6, tm_yday=27, tm_isdst=0)

>>> d.toordinal()  # 返回日期的公历序数。
737086

>>> d.timestamp()  # 返回对应于 datetime 实例的时间戳
1548570141.017905

>>> d.weekday()  # 将星期几作为整数返回,其中星期一为0,星期日为6。等同于 self.date().weekday()。
6
>>> d.isoweekday()  # 将星期几作为整数返回,其中星期一为1,星期日为7。等同于 self.date().isoweekday()。
7
>>> d.isocalendar()  # 返回 3 元组(ISO年,ISO周编号,ISO工作日)。等同于 self.date().isocalendar()。
(2019, 4, 7)

>>> d.isoformat(sep='T')  # 返回以 ISO 8601 格式 YYYY-MM-DDTHH:MM:SS.mmmmmm 表示日期和时间的字符串,如果 microsecond 为 0,则以 YYYY-MM-DDTHH:MM:SS 的格式。
'2019-01-27T14:22:21.017905'
>>> d.__str__()  # 等效于 d.isoformat(' ')
'2019-01-27 14:22:21.017905'

>>> d.ctime()  # 返回一个表示日期和时间的字符串,等效于 time.ctime(time.mktime(d.timetuple()))。
'Sun Jan 27 14:22:21 2019'

>>> d.strftime('%Y-%m-%d')  # 返回一个表示日期和时间的字符串,由显式的格式字符串控制。
'2019-01-27'
>>> d.__format__('%Y-%m-%d') 与 d.strftime() 相同。
'2019-01-27'

格式代码

  • %y 两位数的年份表示(00-99)
  • %Y 四位数的年份表示(000-9999)
  • %m 月份(01-12)
  • %d 月内中的一天(01-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 当前时区的名称
  • %% %号本身

https://docs.python.org/3/library/datetime.html


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com

文章标题:Python datetime 模块

文章字数:3.4k

本文作者:Bin

发布时间:2019-01-17, 16:43:21

最后更新:2019-08-06, 00:07:35

原始链接:http://coolview.github.io/2019/01/17/Python/Python%20datetime%20%E6%A8%A1%E5%9D%97/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录