4.时间的奇淫巧技
- 时间格式和转换
如果想要使用时间,请使用datetime模块,比如我们想要声明一个时间段,则可以使用timedelta实例,就好比
>>> from datetime import timedelta
>>> a = timedelta(days=2, hours=6)
>>> b = timedelta(hours=4.5)
>>> c = a + b
>>> c.days
2
>>> c.seconds
37800
>>> c.seconds / 3600
10.5
>>> c.total_seconds() / 3600
58.5
如果是生成一个日期,则可以使用datetime 实例
>>> from datetime import datetime
>>> a = datetime(2012, 9, 23)
>>> print(a + timedelta(days=10))
2012-10-03 00:00:00
两个datetime实例在进行计算的时候,往往会生成timedelta实例
>>> b = datetime(2012, 12, 21)
>>> d = b – a
>>> d.days
89
一般来说,进行日期计算,datetime模块就够了,不过datetime下的timedelta的话
无法处理月份
>>> b = datetime(2012, 12, 21)
>>> b + timedelta(months=1)
这样会报错
这时候我们可以使用dateutil.relativedelta() 函数代替
>>> from dateutil.relativedelta import relativedelta
>>> a + relativedelta(months=+1)
datetime.datetime(2012, 10, 23, 0, 0)
>>> a + relativedelta(months=+4)
datetime.datetime(2013, 1, 23, 0, 0)
而且relativedelta还支持传入weekday名称,来跳转到指定的周中日期
>>> d = datetime.now()
>>> print(d)
2012-12-23 16:31:52.718111
我们可以跳转到下一个周五
>>> print(d + relativedelta(weekday=FR))
2012-12-28 16:31:52.718111
以及跳转到上一个周五
>>> print(d + relativedelta(weekday=FR(-1)))
2012-12-21 16:31:52.718111
- 获取当前月份的日期
如果我们希望获取到一个月份内的日期返回,可以使用calendar模块下的monthrange
这样我们展示下
首先是创建一个datatime
>>> d = datetime.now()
>>> d1 = d.replace(day=1)
>>> _, days_in_month = calendar.monthrange(d1.year, d1.month)
首先我们利用replace方法将days属性设置为1,datatime是支持replace方法的,会返回一个新的datetme实例
其次是calendar.monthrange()函数可以找到这个月的总天数
最后我们说一下,datetime支持直接使用比较符进行比较
唯一缺点是没有支持range() 函数
比如这一点我们可以使用一个生成器来实现这个目标
def date_range(start, stop, step):
while start < stop:
yield start
start += step
- 字符串转换为日期
如果是想要将字符串转换为日期,可以使用
datetime进行解决
>>> text = ‘2012-09-20’
>>> y = datetime.strptime(text, ‘%Y-%m-%d’)
datetime.strptime()方法支持很多格式化代码,这些格式化代码,可以转换为日期,或从日期中转换回来
不过需要注意,strptime的性能很差
- Python中的时区操作
如果希望对时间操作之外,加上时区的相关信息,那么需要考虑使用pytz模块,他会进行时区相关的转换
我们可以利用这个模块将原本datetime进行时区化
>>> from pytz import timezone
>>> d = datetime(2012, 12, 21, 9, 30, 0)
>>> central = timezone(‘US/Central’)
>>> loc_d = central.localize(d)
这样日期就本地化了,然后我们就可以将其转换为其他时区的时间
>>> bang_d = loc_d.astimezone(timezone(‘Asia/Kolkata’))
>>> print(bang_d)
2012-12-21 21:00:00+05:30
需要注意,在夏令时和冬令时进行转换的时候需要注意normalize()方法进行转换,不然可能存在问题
>>> from datetime import timedelta
>>> later = central.normalize(loc_d + timedelta(minutes=30))
>>> print(later)
最后就是对应的时区转换的时候,我们需要知道其时区的名称,这一点可以查看ISO 3166国家代码
pytz.country_timezones