python 取日期

3.1 计算昨天和明天的日期

感谢:Andrea Cavalcanti

任务

你想获得今天的日期,并以此计算昨天和明天的日期。

解决方案

无论何时你遇到有关"时间变化"或者"时间差"的问题,先考虑timedelta:

 
 
  1. import datetime

  2. today = datetime.date.today( )

  3. yesterday = today - datetime.timedelta(days=1)

  4. tomorrow = today + datetime.timedelta(days=1)

  5. print yesterday, today, tomorrow

  6. #输出:2004-11-17 2004-11-18 2004-11-19

讨论

自从datetime模块出现以来,这个问题在Python邮件列表中频频露面。当首次碰到这个问题时,人们的第一个想法是写这样的代码:yesterday = today - 1,但其结果是一个TypeError: unsupported operand type(s) for -: 'datetime.date' and 'int'。

一些人认为这是个bug,并暗示Python应该能够猜测出他们的意图。然而,Python的一个指导原则是:"在模糊含混面前拒绝猜测",这也是Python简洁和强大的原因。猜测意味着需要用启发的方式将datetime割裂开来,需要猜测你想减去的究竟是1天还是1秒,再或者干脆是1年?

Python如同它一贯的方式,并不尝试猜测你的意图,而是期待你明确指定你自己的意图。如果想减去长度为1天的一个时间差,应当明确地编写相关代码。再或者,想加上长度为1秒的时间差值,可以使用timedelta配合datetime.datetime对象,这样可以用同样的语法编写相关操作。也许对每个任务都想使用这种方法,因为这种方法给了你足够的自由度,同时还保持着简洁直观。考虑下面的片段:

 
 
  1. >>>anniversary = today + datetime.timedelta(days=365)
    # 增加1年

  2. >>> print anniversary

  3. 2005-11-18

  4. >>>t = datetime.datetime.today( )
    # 获得现在的时间

  5. >>> t

  6. datetime.datetime(2004, 11, 19, 10, 12, 43, 801000)

  7. >>>tt2 = t + datetime.timedelta(seconds=1)
    # 增加1秒

  8. >>> t2

  9. datetime.datetime(2004, 11, 19, 10, 12, 44, 801000)

  10. >>>tt3 = t + datetime.timedelta(seconds=3600)
    # 增加1小时

  11. >>> t3

  12. datetime.datetime(2004, 11, 19, 11, 12, 43, 801000)

如果你想在日期和时间的计算上有点新花样,可以使用第三方包,如dateutil(可以和内建的datetime协同工作)和经典的mx.DateTime。举个例子:

 
 
  1. from dateutil import relativedelta

  2. nextweek = today + relativedelta.relativedelta(weeks=1)

  3. print nextweek

  4. #输出:2004-11-25

然而,"总是应该让它尽可能简单地工作"。为了保持简单,本节解决方案中使用了datetime.timedelta。


你可能感兴趣的:(python,DateTime,timedelta)