python 日期处理 date,datetime,timedelta

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:00
2012-09-01 06:00:00
...
2012-09-30 06:00:00
2012-09-30 12:00:00
2012-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
>>> diff
datetime.timedelta(253, 786, 548284)
>>>

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

>>> z
datetime.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
>>>

你可能感兴趣的:(python)