Skip to content

日期时间模块

datetime 包含用于处理日期和时间的函数和类。

Date 类

日期值用date 类表示。实例具有属性yearmonthday。使用today()类方法可以轻松创建当前日期。

date 类表示一个日期(由年、月、日组成),其原型如下:

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

参数说明:

  1. year 的范围是 [MINYEAR, MAXYEAR],即 [1, 9999]
  2. month 的范围是[1, 12]。(月份是从1开始的,不是从0开始);
  3. day 的最大值根据给定的 year, month 参数来决定。例如闰年2月份有29天;


date 类对象定义了一些常用的类方法与类属性:

  1. date.maxdate.mindate 对象所能表示的最大、最小日期;
  2. date.resolutiondate 对象表示日期的最小单位。这里是天。
  3. date.today():返回一个表示当前本地日期的 date 对象;
  4. date.fromtimestamp(timestamp):根据给定的时间戮,返回一个 date 对象;
  5. datetime.fromordinal(ordinal):将 Gregorian 日历时间转换为 date 对象;(Gregorian Calendar:一种日历表示方法,类似于我国的农历,西方国家使用比较多)

使用示例:

python
>>> datetime.date.max
datetime.date(9999, 12, 31)
>>> datetime.date.min
datetime.date(1, 1, 1)
>>> datetime.date.resolution
datetime.timedelta(1)
>>> datetime.date.today()
datetime.date(2016, 5, 12)
>>> datetime.date.fromtimestamp(time.time())
datetime.date(2016, 5, 12)

常用方法和属性

  1. date.yeardate.monthdate.day:年、月、日;
  2. date.replace(year, month, day):生成一个新的日期对象,用参数指定的年,月,日代替原有对象中的属性。(原有对象仍保持不变)
  3. date.timetuple():返回日期对应的 time.struct_time 对象;
  4. date.toordinal():返回日期对应的Gregorian Calendar日期;
  5. date.weekday():返回 weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推;
  6. data.isoweekday():返回 weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推;
  7. date.isocalendar():返回格式如(year,month,day)的元组;
  8. date.isoformat():返回格式如 'YYYY-MM-DD' 的字符串;
  9. date.strftime(fmt):自定义格式化字符串。

使用示例:

python
>>> import datetime
>>> today = datetime.date.today()
>>> today.year
2023
>>> today.month
11
>>> today.day
14
>>> today.weekday()
1
>>> today.isoweekday()
2
>>> today.isoformat()
'2023-11-14'
>>> today.strftime("%Y-%m-%d")
'2023-11-14'

Time 类

time 类表示时间(由时、分、秒以及微秒组成),其原型如下:

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

参数说明:

  1. hour 的范围为[0, 24),
  2. minute 的范围为[0, 60)
  3. second 的范围为[0, 60)
  4. microsecond 的范围为[0, 1000000),
  5. tzinfo 表示时区信息。

time 类定义的类属性:

  1. time.mintime.max:time 类所能表示的最小、最大时间。

    其中,time.min = time(0, 0, 0, 0)time.max = time(23, 59, 59, 999999)

  2. time.resolution:时间的最小单位,这里是 1 微秒;

    使用示例:

    python
    >>> datetime.time.min
    datetime.time(0, 0)
    >>> datetime.time.max
    datetime.time(23, 59, 59, 999999)
    >>> datetime.time.resolution
    datetime.timedelta(0, 0, 1)

方法和属性

  1. time.hourtime.minutetime.secondtime.microsecond:时、分、秒、微秒;
  2. time.tzinfo:时区信息;
  3. time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]):创建一个新的时间对象,用参数指定的时、分、秒、微秒代替原有对象中的属性(原有对象仍保持不变);
  4. time.isoformat():返回型如 'HH:MM:SS'' 格式的字符串表示;
  5. time.strftime(fmt):返回自定义格式化字符串。

使用示例:

python
>>> tm = datetime.time(18, 18, 18)
>>> tm.hour
18
>>> tm.minute
18
>>> tm.second
18
>>> tm.microsecond
0
>>> tm.tzinfo
>>> tm.isoformat()
'18:18:18'
>>> tm.replace(hour=20)
datetime.time(20, 18, 18)
>>> tm.strftime("%I:%M:%S %p")
'06:18:18 PM'

time 类的对象只能进行比较,无法进行加减操作。

datetime 类

datetimedatetime 的结合体,包括 datetime 的所有信息。其原型如下:

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

各参数的含义与 datetime 的构造函数中的一样,要注意参数值的范围。

datetime 类定义的类属性与方法:

  1. datetime.mindatetime.maxdatetime 所能表示的最小值与最大值;
  2. datetime.resolutiondatetime 最小单位;
  3. datetime.today():返回一个表示当前本地时间的 datetime 对象;
  4. datetime.now([tz]):返回一个表示当前本地时间的 datetime 对象,如果提供了参数 tz,则获取 tz 参数所指时区的本地时间;
  5. datetime.utcnow():返回一个当前 utc 时间的 datetime 对象;
  6. datetime.fromtimestamp(timestamp[, tz]):根据时间戮创建一个 datetime 对象,参数 tz 指定时区信息;
  7. datetime.utcfromtimestamp(timestamp):根据时间戮创建一个 datetime 对象;
  8. datetime.combine(date, time):根据 datetime,创建一个 datetime 对象;
  9. datetime.strptime(date_string, format):将格式字符串转换为 datetime 对象,datatime 类没有提供该方法。

使用示例:

python
>>> import datetime
>>> datetime.datetime.min
datetime.datetime(1, 1, 1, 0, 0)
>>> datetime.datetime.max
datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)
>>> datetime.datetime.resolution
datetime.timedelta(microseconds=1)
>>> print(datetime.datetime.resolution)
0:00:00.000001

获取当前的时间

python
>>> today = datetime.datetime.today()
>>> today
datetime.datetime(2023, 5, 8, 15, 53, 20, 719496)
>>> datetime.datetime.now()
datetime.datetime(2023, 5, 8, 15, 53, 31, 554708)
>>> datetime.datetime.utcnow()
datetime.datetime(2023, 5, 8, 7, 53, 36, 259756)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2023, 5, 8, 15, 53, 49, 574983)

方法与属性

datetime 类提供的实例方法与属性大部分功能与 datetime 类似,这里仅罗列方法名不再赘述:

  1. datetime.yearmonthdayhourminutesecondmicrosecondtzinfo
  2. datetime.date():获取date对象;
  3. datetime.time():获取time对象;
  4. datetime.ctime():返回一个日期时间的C格式字符串,等效于 time.ctime(time.mktime(dt.timetuple()))
  5. datetime.strftime(format)

datetime 对象同样可以进行比较,或者相减返回一个时间间隔对象,或者日期时间加上一个间隔返回一个新的日期时间对象。

合并 data 与 time

datetime 实例具有 datetime 对象的所有属性。

datetime 一样,date 为创建新实例提供了方便的类方法。

python
import datetime

t = datetime.time(1, 2, 3)
print('t :', t)  # t : 01:02:03

d = datetime.date.today()
print('d :', d)  # d : 2018-03-18

dt = datetime.datetime.combine(d, t)
print('dt:', dt)  # dt: 2018-03-18 01:02:03

combine()从一个 date和一个time实例创建datetime实例。

字符串格式化和解析

datetime 对象的默认字符串表示形式使用 ISO-8601 格式(YYYY-MM-DDTHH:MM:SS.mmmmmm)。可以使用 strftime() 对其进行格式化。

python
import datetime

ft = "%Y %m %d %H:%M:%S %Y"

today = datetime.datetime.today()
print('默认ISO     :', today)  # ISO     : 2018-03-18 16:20:34.941204

s = today.strftime(ft)
print('字符串格式化:', s)  # strftime: Sun Mar 18 16:20:34 2018

每个日期时间格式代码仍必须以前缀为前缀%,后续冒号将作为文字字符处理,以包含在输出中。

符号含义
%a缩写的工作日名称'Wed'
%A完整的工作日名称'Wednesday'
%w工作日编号 - 0(星期日)至6(星期六)'3'
%d每月的一天(零填充)'13'
%b缩写的月份名称'Jan'
%B全月名称'January'
%m一年中的一个月'01'
%y没有世纪的一年'16'
%Y与世纪的一年'2016'
%H24小时制的小时'17'
%I12小时制的小时'05'
%p上午下午'PM'
%M分钟'00'
%S'00'
%f微秒'000000'
%z时区感知对象的UTC偏移量'-0500'
%Z时区名称'EST'
%j一年中的某一天'013'
%W一年中的一周'02'
%c当前区域设置的日期和时间表示形式'Wed Jan 13 17:00:00 2016'
%x当前区域设置的日期表示形式'01/13/16'
%X当前区域设置的时间表示'17:00:00'
%%文字%字符'%'

时间戳互转

python
>>> import datetime
>>> today = datetime.datetime.today()
>>> today.timestamp()
1670482659.845911
>>> datetime.datetime.fromtimestamp(1670482659)
datetime.datetime(2022, 12, 8, 14, 57, 39)

timedelta 类

datetime.timedelta 对象代表两个时间之间的的时间差,两个 datedatetime 对象相减时可以返回一个 timedelta 对象。其原型如下:

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

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

内部只存储 dayssecondsmicroseconds,其他参数的值会自动按如下规则抓转换:

  1. 1 millisecond(毫秒) 转换成 1000 microseconds(微秒)
  2. 1 minute 转换成 60 seconds
  3. 1 hour 转换成 3600 seconds
  4. 1 week 转换成 7 days
python
b = a + datetime.timedelta(hours=5)
c = a + datetime.timedelta(weeks=1)

日期计算

date 重载了简单的运算符

python
# datetime 允许对日期进行加减和比较:
# 日期加上一个间隔,返回一个新的日期对象
datetime2 = datetime1 + timedelta
# 日期隔去间隔,返回一个新的日期对象
datetime2 = datetime1 - timedelta
# 两个日期相减,返回一个时间间隔对象
timedelta = datetime1 - datetime2
# 两个日期进行比较
datetime1 < datetime2

使用示例:

python
>>> import datetime
>>> now = datetime.datetime.today()
>>> now                             
datetime.datetime(2023, 10, 21, 14, 35, 59, 60648)
>>> datetime.datetime.resolution 
datetime.timedelta(microseconds=1)
>>> now += datetime.datetime.resolution 
>>> now
datetime.datetime(2023, 10, 21, 14, 35, 59, 60649)
>>> now -= datetime.datetime.resolution 
>>> now
datetime.datetime(2023, 10, 21, 14, 35, 59, 60648)

datetime.date(2016, 5, 13)
>>> now -= datetime.datetime.resolution 
>>> now
datetime.date(2016, 5, 12)
>>> now < datetime.datetime.max 
True

日期和时间比较

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

python
import datetime
import time

print('Times:')
t1 = datetime.time(12, 55, 0)
print('  t1:', t1)
t2 = datetime.time(13, 5, 0)
print('  t2:', t2)
print('  t1 < t2:', t1 < t2)

print('Dates:')
d1 = datetime.date.today()
print('  d1:', d1)
d2 = datetime.date.today() + datetime.timedelta(days=1)
print('  d2:', d2)
print('  d1 > d2:', d1 > d2)

支持所有比较运算符。

案例:日期计算

日期计算使用标准算术运算符。

例:计算新中国诞生了多少天。

python
import datetime

today = datetime.date.today()
print('Today    :', today)  # Today    : 2018-03-18

birth_day = datetime.date(1949, 10, 10)
diff = today - birth_day
print("新中国诞生了 %s 日" % diff.days)

one_day = datetime.timedelta(days=1)
print('一天时间  :', one_day)  # 一天时间  : 1 day, 0:00:00

yesterday = today - one_day
print('昨天:', yesterday)  # 昨天: 2018-03-17

tomorrow = today + one_day
print('明天 :', tomorrow)  # 明天 : 2018-03-19

print('明天 - 昨天:', tomorrow - yesterday)  # 2 days, 0:00:00
print('昨天 - 明天:', yesterday - tomorrow)  # -2 days, 0:00:00

示例说明了使用timedelta 对象计算新日期,可以减去日期实例以生成 timedeltas(包括负 delta 值)。

timedelta对象还支持与整数,浮点数和其他timedelta对象进行算术运算。