Table Of Contents

Previous topic

PyMOTW: time

Next topic

PyMOTW: urllib

This Page

PyMOTW: datetime

  • 模块: datetime
  • 目的: 日期/时间处理
  • python版本: 2.3+

datetime模块包含了一些用于时间解析、格式化、计算的函数.

时间

时间值由time类来表示, Times有小时, 分, 秒和微秒属性. 以及包含时区信息. 初始化time实例的参数是可选的, 但这样的话, 你将获得初始值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

一个time实例只包含时间值, 不包含日期值.

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 ]:
    print '%02.1f :' % m, datetime.time(0, 0, 0, microsecond=m)

实际中, 如果使用浮点型作为微秒参数, 那么将产生一些警告信息.

$ python datetime_time_resolution.py
/home/cjj/python/pymotw/datetime_time_resolution.py:14: DeprecationWarning: integer argument expected, got float
print '%02.1f :' % m, datetime.time(0, 0, 0, microsecond=m)
1.0 : 00:00:00.000001
0.0 : 00:00:00
0.1 : 00:00:00
0.6 : 00:00:00

日期

日期值可以由date类来表示, 实例有年、月、日属性, 使用data类的 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
2008-03-13
ctime: Thu Mar 13 00:00:00 2008
tuple: (2008, 3, 13, 0, 0, 0, 3, 73, -1)
ordinal: 733114
Year: 2008
Mon : 3
Day : 13

使用整数(从阳历的第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: 1205436039.53
fromtimestamp(t): 2008-03-13

日期的最大和最小范围可以使用属性max和min来表示.

import datetime

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

一个日期的单位就是1天.

$ 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

timedelta

除了 replace() 函数可以计算过去或者未来的时间, 还可以使用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

比较

时间和日期值都可以通过标准的操作符来进行比较.

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: 2008-03-13
     d2: 2008-03-14
     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实例拥有date和time对象的所有属性.

$ python datetime_datetime.py
Now : 2008-03-15 22:58:14.770074
Today : 2008-03-15 22:58:14.779804
UTC Now: 2008-03-16 03:58:14.779858
year : 2008
month : 3
day : 15
hour : 22
minute : 58
second : 14
microsecond : 780399

datetime类提供了一些类方法来创建新的实例, 当然它也包含 fromordinal()fromtimestamp() , 如果你已经有一个日期实例和时间实例, 并需要创建datetime的话, combine()方法比较有用.

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 : 2008-03-16
dt: 2008-03-16 01:02:03

格式化和解析

datetime对象的字符串表示方法默认使用的是ISO 8601格式(YYYY-MM-DDTHH:MM:SS.mmmmmm), 使用 strftime() 可以产生其他格式, 同样, 如果你的输入值是用 time.strptime() 解析的时间戳, 那么 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     : 2008-03-16 08:08:16.275134
strftime: Sun Mar 16 08:08:16 2008
strptime: Sun Mar 16 08:08:16 2008

时区

时区是由子类 datetime.tzinfo 来表示的, tzinfo是一个抽象的基类, 你需要定义子类, 并提供相应的方法去实现一些方法. 很可惜, dateime不包含任何实际可用的实现, 可以参考 文档 来获取一些示例.