2007-08-07

 

Python Cookbook 3.1 计算昨天和明天

需求:

你需要得到今天的日期,然后计算昨天的或明天的日期.

讨论:

任何需要计算时间"变化"或"差值"的时候,请考虑使用timedelta:

import datetime
today = datetime.date.today( )
yesterday = today - datetime.timedelta(days=1)
tomorrow = today + datetime.timedelta(days=1)
print yesterday, today, tomorrow
#emits: 2004-11-17 2004-11-18 2004-11-19

本节提出的问题在Python邮件列表里面经常被问道.当我们第一次面对这个问题的时候,直觉的想法是写下代码如:yesterday = today-1,它会报出异常: TypeError: unsupported operand type(s) for -: ' datetime.date' and 'int'.
有些人认为这是Python的一个bug,它们期望Python能猜测用户的目的.然而,Python简单和强大的一个信条就是:遇到不清楚的时候,拒绝猜测.假如要尝试猜测的话,必须要认真考虑你指的一天,一秒,还是一年.
Python不会猜测你的需求,而是让你表达的更明确,如果你希望给一个时间减去一天,就显示的写出这样的代码.如果,你希望给一个时间加上一秒,你可以使用timedelta和datetime.datetime对象 ,然后可以使用相同的语法来实现.像这样,对于每一个你希望完成的任务,都会只有一个明确的方式来完成.这样做也会增加很多灵活性,而且不让问题变得更复杂.看看下面的脚本:

>>> anniversary = today + datetime.timedelta(days=365)          # add 1 year
>>> print anniversary
2005-11-18
>>> t = datetime.datetime.today( )                               # get right now
>>> t
datetime.datetime(2004, 11, 19, 10, 12, 43, 801000)
>>> t2 = t + datetime.timedelta(seconds=1)                      # add 1 second
>>> t2
datetime.datetime(2004, 11, 19, 10, 12, 44, 801000)
>>> t3 = t + datetime.timedelta(seconds=3600)                   # add 1 hour
>>> t3
datetime.datetime(2004, 11, 19, 11, 12, 43, 801000)

请记住,如果你爱好对时间进行计算,第三方包,比如dateutil和经典的mx.Datetime都很适合,如:

from dateutil import relativedelta
nextweek = today + relativedelta.relativedelta(weeks=1)
print nextweek
#emits: 2004-11-25

然而,"总是用最简单的方式来工作",为了简单起见, 用datetime.timedelta就足够了.

相关说明:

class timedelta(__builtin__.object)
 Difference between two datetime values.

支持的操作有:
abs,四则运算及常见比较.

 Data descriptors defined here:

 days
     Number of days.

 microseconds
     Number of microseconds (>= 0 and less than 1 second).

 seconds
     Number of seconds (>= 0 and less than 1 day).

 ----------------------------------------------------------------------
 Data and other attributes defined here:

 max = datetime.timedelta(999999999, 86399, 999999)

 min = datetime.timedelta(-999999999)

 resolution = datetime.timedelta(0, 0, 1)

标签:


Comments: 发表评论



<< Home

This page is powered by Blogger. Isn't yours?