| 目的: | datetime模块包括用于执行日期和时间解析,格式化和算术的函数和类。 | | 适用于: | 2.3及更高版本 |

datetime 包含用于处理日期和时间,separatley以及一起使用的函数和类。

时代

时间值用 时间 类别 表示 。 时间具有小时,分钟,秒和微秒的属性。 它们还可以包括时区信息。 初始化 时间 实例 的参数 是可选的,但是默认值 0 不太可能是您想要的。

import datetime

t = datetime.time(1, 2, 3) print t print 'hour :', t.hour print 'minute:', t.minute print 'second:', t.second print 'microsecond:', t.microsecond print 'tzinfo:', t.tzinfo

$ python datetime_time.py

01:02:03 hour : 1 minute: 2 second: 3 microsecond: 0 tzinfo: None

时间实例仅保存时间值,而不保存与该时间关联的日期。

import datetime

print 'Earliest :', datetime.time.min print 'Latest :', datetime.time.max print 'Resolution:', datetime.time.resolution

最小最大 类的属性反映的时间在一天的有效范围。

$ python datetime_time_minmax.py

Earliest : 00:00:00 Latest : 23:59:59.999999 Resolution: 0:00:00.000001

时间分辨率仅限于整个微秒。

import datetime

for m in [ 1, 0, 0.1, 0.6 ]: try: print '%02.1f :' % m, datetime.time(0, 0, 0, microsecond=m) except TypeError, err: print 'ERROR:', err

实际上,对微秒参数使用浮点数会生成 TypeError

$ python datetime_time_resolution.py

1.0 : 00:00:00.000001 0.0 : 00:00:00 0.1 : ERROR: integer argument expected, got float 0.6 : ERROR: integer argument expected, got float

日期

日历日期值用 date 类 表示 。 实例具有年,月和日的属性。 使用 today() 类方法 创建代表今天日期的日期很容易 。

import datetime

today = datetime.date.today() print today print 'ctime:', today.ctime() print 'tuple:', today.timetuple() print 'ordinal:', today.toordinal() print 'Year:', today.year print 'Mon :', today.month print 'Day :', today.day

本示例以几种格式打印当前日期:

$ python datetime_date.py

2013-02-21 ctime: Thu Feb 21 00:00:00 2013 tuple: time.struct_time(tm_year=2013, tm_mon=2, tm_mday=21, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=52, tm_isdst=-1) ordinal: 734920 Year: 2013 Mon : 2 Day : 21

还有一些类方法可用于从整数(使用公历1的1月1日开始计数)使用POSIX时间戳值来创建整数实例。

import datetime import time

o = 733114 print 'o:', o print 'fromordinal(o):', datetime.date.fromordinal(o) t = time.time() print 't:', t print 'fromtimestamp(t):', datetime.date.fromtimestamp(t)

此示例说明了 fromordinal() 和 fromtimestamp() 使用的不同值类型 。

$ python datetime_date_fromordinal.py

o: 733114 fromordinal(o): 2008-03-13 t: 1361446545.52 fromtimestamp(t): 2013-02-21

time一样 ,可以使用 minmax 属性 确定支持的日期值的范围 。

import datetime

print 'Earliest :', datetime.date.min print 'Latest :', datetime.date.max print 'Resolution:', datetime.date.resolution

日期的分辨率是整天。

$ python datetime_date_minmax.py

Earliest : 0001-01-01 Latest : 9999-12-31 Resolution: 1 day, 0:00:00

创建新日期实例的另一种 方法是使用现有日期 的 replace() 方法。 例如,您可以更改年份,而无需考虑日期和月份。

import datetime

d1 = datetime.date(2008, 3, 12) print 'd1:', d1

d2 = d1.replace(year=2009) print 'd2:', d2

$ python datetime_date_replace.py

d1: 2008-03-12 d2: 2009-03-12

timedeltas

使用 replace() 并不是计算将来/过去日期的唯一方法。 您可以使用 日期时间 通过执行上的日期值基本算术 timedelta 类。 减去日期会产生一个 timedelta ,并且 可以从一个日期中添加或减去 一个 timedelta 以产生另一个日期。 timedelta 的内部值以 天,秒和微秒为单位存储。

import datetime

print "microseconds:", datetime.timedelta(microseconds=1) print "milliseconds:", datetime.timedelta(milliseconds=1) print "seconds :", datetime.timedelta(seconds=1) print "minutes :", datetime.timedelta(minutes=1) print "hours :", datetime.timedelta(hours=1) print "days :", datetime.timedelta(days=1) print "weeks :", datetime.timedelta(weeks=1)

传递给构造函数的中间级别值转换为天,秒和微秒。

$ python datetime_timedelta.py

microseconds: 0:00:00.000001 milliseconds: 0:00:00.001000 seconds : 0:00:01 minutes : 0:01:00 hours : 1:00:00 days : 1 day, 0:00:00 weeks : 7 days, 0:00:00

日期算术

日期数学使用标准算术运算符。 此具有日期对象的示例说明了如何使用 timedelta 对象计算新日期,并减去日期实例以生成timedelta(包括负增量值)。

import datetime

today = datetime.date.today() print 'Today :', today

one_day = datetime.timedelta(days=1) print 'One day :', one_day

yesterday = today - one_day print 'Yesterday:', yesterday

tomorrow = today + one_day print 'Tomorrow :', tomorrow

print 'tomorrow - yesterday:', tomorrow - yesterday print 'yesterday - tomorrow:', yesterday - tomorrow

$ python datetime_date_math.py

Today : 2013-02-21 One day : 1 day, 0:00:00 Yesterday: 2013-02-20 Tomorrow : 2013-02-22 tomorrow - yesterday: 2 days, 0:00:00 yesterday - tomorrow: -2 days, 0:00:00

比较值

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

import datetime import time

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

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

$ python datetime_comparing.py

Times: t1: 12:55:00 t2: 13:05:00 t1 < t2: True Dates: d1: 2013-02-21 d2: 2013-02-22 d1 > d2: False

结合日期和时间

使用 datetime 类来保存由日期和时间组成的值。 与 date一样 ,有几种方便的类方法可用于 从其他公共值 创建 datetime 实例。

import datetime

print 'Now :', datetime.datetime.now() print 'Today :', datetime.datetime.today() print 'UTC Now:', datetime.datetime.utcnow()

d = datetime.datetime.now() for attr in [ 'year', 'month', 'day', 'hour', 'minute', 'second', 'microsecond']: print attr, ':', getattr(d, attr)

如您所料, datetime 实例具有日期和时间对象的所有属性。

$ python datetime_datetime.py

Now : 2013-02-21 06:35:45.658505 Today : 2013-02-21 06:35:45.659381 UTC Now: 2013-02-21 11:35:45.659396 year : 2013 month : 2 day : 21 hour : 6 minute : 35 second : 45 microsecond : 659677

与日期一样,datetime提供了用于创建新实例的便捷类方法。 它还包括 fromordinal() 和 fromtimestamp() 。 另外, 如果您已经有一个日期实例和一个时间实例并想创建一个日期时间 ,则 combin() 可能会很有用。

import datetime

t = datetime.time(1, 2, 3) print 't :', t

d = datetime.date.today() print 'd :', d

dt = datetime.datetime.combine(d, t) print 'dt:', dt

$ python datetime_datetime_combine.py

t : 01:02:03 d : 2013-02-21 dt: 2013-02-21 01:02:03

格式化和解析

日期时间对象的默认字符串表示形式使用 ISO 8601 格式( YYYY-MM-DDTHH:MM:SS.mmmmmm )。 可以使用 strftime() 生成其他格式 。 同样,如果您的输入数据包括可使用 time.strptime() 解析的时间戳值 ,则 datetime.strptime() 是将其转换为datetime实例的便捷方法。

import datetime

format = "%a %b %d %H:%M:%S %Y"

today = datetime.datetime.today() print 'ISO :', today

s = today.strftime(format) print 'strftime:', s

d = datetime.datetime.strptime(s, format) print 'strptime:', d.strftime(format)

$ python datetime_datetime_strptime.py

ISO : 2013-02-21 06:35:45.707450 strftime: Thu Feb 21 06:35:45 2013 strptime: Thu Feb 21 06:35:45 2013

时区

datetime中 ,时区由 tzinfo 的子类表示 。 由于 tzinfo 是抽象的基类,因此您需要定义一个子类并为一些方法提供适当的实现以使其有用。 不幸的是, 尽管文档确实提供了一些示例实现,但 datetime 并未包括任何可供使用的实际实现。 有关使用固定偏移量和DST感知类的示例,以及有关创建自己的类的更多详细信息,请参阅标准库文档页面。 pytz 也是时区实施细节的良好来源。

也可以看看

约会时间

该模块的标准库文档。

日历

日历 模块。

时间

时间 模块。

dateutil

Labix的dateutil使用其他功能扩展了datetime模块。

WikiPedia:阳历公历

公历系统的描述。

pytz

世界时区数据库

ISO 8601

日期和时间的数字表示标准