4.时间的奇淫巧技

  1. 时间格式和转换

如果想要使用时间,请使用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

  1. 获取当前月份的日期

如果我们希望获取到一个月份内的日期返回,可以使用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

  1. 字符串转换为日期

如果是想要将字符串转换为日期,可以使用

datetime进行解决

>>> text = ‘2012-09-20’

>>> y = datetime.strptime(text, ‘%Y-%m-%d’)

datetime.strptime()方法支持很多格式化代码,这些格式化代码,可以转换为日期,或从日期中转换回来

不过需要注意,strptime的性能很差

  1. 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

发表评论

邮箱地址不会被公开。 必填项已用*标注