python 日期处理 date,datetime,timedelta

来源:互联网 发布:淘宝卖家快递单打印 编辑:程序博客网 时间:2024/06/05 23:28

1. 日期的迭代

使用一个生成器来为日期迭代创建一个同内置的 range() 函数一样的函数:以6小时为步长来进行规定范围内日期的迭代生成

>>> from datetime import date,datetime ,timedelta>>> def date_range(start,stop,step):...     while start < stop :...      yield start...      start += step... >>> for d in date_range(datetime(2012,9,1),datetime(2012,10,1),timedelta(hours=6)):...     print d... 2012-09-01 00:00:002012-09-01 06:00:00...2012-09-30 06:00:002012-09-30 12:00:002012-09-30 18:00:00>>> 

2. 字符串转换为日期

如果应用程序接受字符串格式的输入,但是你想将它们转换为 datetime 对象以便在上面执行非字符串操作要怎么去实现呢?
使用Python的标准模块 datetime 可以很容易的解决这个问题。比如:

>>> from datetime import datetime>>> text = '2016-12-12'>>> y = datetime.strptime(text, '%Y-%m-%d')>>> z = datetime.now()>>> diff = z - y>>> diffdatetime.timedelta(253, 786, 548284)>>>

这里写图片描述
datetime.strptime() 方法支持很多的格式化代码, 比如 %Y 代表4位数年份, %m 代表两
位数月份。 还有一点值得注意的是这些格式化占位符也可以反过来使用,将日期输出为
指定的格式字符串形式。
比如,假设你的代码中生成了一个 datetime 对象, 你想将它格式化为漂亮易读形式后放
在自动生成的信件或者报告的顶部:

>>> zdatetime.datetime(2012, 9, 23, 21, 37, 4, 177393)>>> nice_z = datetime.strftime(z, '%A %B %d, %Y')>>> nice_z'Sunday September 23, 2012'>>>

如果你已经知道日期格式是 YYYY-MM-DD ,你可以像下面这样实现一个解析函数,性能比上边的程序要高出很多:
from datetime import datetime
def parse_ymd(s):
year_s, mon_s, day_s = s.split(‘-‘)
return datetime(int(year_s), int(mon_s), int(day_s))
实际测试中,这个函数比 datetime.strptime() 快7倍多。 如果你要处理大量的涉及到日期的数据的话,那么最好考虑下这个方案!

3. 结合时区的日期操作

对几乎所有涉及到时区的问题,你都应该使用 pytz 模块。这个包提供了Olson时区数据库, 它是时区信息的事实上的标准,在很多语言和操作系统里面都可以找到。
pytz 模块一个主要用途是将 datetime 库创建的简单日期对象本地化。 比如,下面如何
表示一个芝加哥时间的示例:

>>> from datetime import datetime>>> from pytz import timezone>>> d = datetime(2012, 12, 21, 9, 30, 0)>>> print(d)2012-12-21 09:30:00>>>>>> # Localize the date for Chicago>>> central = timezone('US/Central')>>> loc_d = central.localize(d)>>> print(loc_d)2012-12-21 09:30:00-06:00>>>

一旦日期被本地化了, 它就可以转换为其他时区的时间了。 为了得到班加罗尔对应的时间,你可以这样做:

>>> # Convert to Bangalore time>>> bang_d = loc_d.astimezone(timezone('Asia/Kolkata'))>>> print(bang_d)2012-12-21 21:00:00+05:30>>>

为了不让你被这些东东弄的晕头转向,处理本地化日期的通常的策略先将所有日期转换为
UTC时间, 并用它来执行所有的中间存储和操作。比如:

>>> print(loc_d)2013-03-10 01:45:00-06:00>>> utc_d = loc_d.astimezone(pytz.utc)>>> print(utc_d)2013-03-10 07:45:00+00:00>>>
原创粉丝点击