Swift51.com
麦子学院 头像
麦子学院  2016-12-20 21:06

Python的datetime模块如何使用?

回复:0  查看:2951  

Python开发中,datetime模块提供了操作日期和时间功能该模块提供了五种核心对象:datetime(时间日期类型), date(日期类型), time(时间类型), tzinfo(时区类型), timedelta(时间差类型)。分别如下:


一、datetime 对象


datetime对象可以用来表示精确的日期和时间,其实例化方法如下


>>> from datetime import datetime

>>> birthday = datetime(year=1993, month=10, day=20)

>>> birthday

datetime.datetime(1993, 10, 20, 0, 0)

>>> birthday.month

10

>>> now = datetime.now() # 返回当前时间

>>> now

datetime.datetime(2016, 12, 17, 20, 3, 25, 898000)

在实例化datetime对象时,year, month, day是必填项,hour, minute, second, microsecond(微秒), tzinfo(时区)是可选项。


二、date 对象


date对象和datetime对象的区别在于,date对象只能表示日期,不能表示时间(即其精确度为天)。date实例化时须要且仅须要三个参数:year, month, daydate对象是没有时区(tzinfo)属性的。


>>> from datetime import date

>>> birthday = date(year=2016, month=12, day=17)

>>> birthday

datime.date(2016, 12, 17)

>>> birthday.year

2016

三、time对象


date对象相反,time对象只能用来表示时间,而不能用来表示日期。time对象所表示的时间可以精确到微秒,而且可以具有时区(tzinfo)属性。


>>> from datetime import time

>>> now_time = time(hours=20, minute=30, second=10) # hours, minute, secondmicrosecond, tzinfo都是可选参数

>>> now_time

datetime.time(20, 30, 10)

>>> now_time.hours

20

这里要注意,python中还有另外一个模块我们经常用到的模块:time,这个模块也含有用来表示时间、日期对象的函数,但因为该模块下的函数都是对同名C函数的直接调用,所以返回的对象都不太pythonic,所以我们一般不用,经常使用的就两个函数:time.sleep(), time.time()


>>> import time

>>> time.time() #返回当前时间戳

1481979297.533

>>> time.sleep(5)  # 程序进入睡眠5s

四、timedelta对象


timedelta对象表示一个时间段,timedelta对象可以通过手动实例化得到,也可以通过上述三个对象(datetime, date, time)相减得到。


>>> from datetime import datetime, timedleta

>>> now = datetime.now()

>>> last = datetime(year=2016, month=3, day=10, hour=8)

>>> delta = now - last

>>> delta

datetime.timedelta(282, 47010, 328000)

>>> last + delta == now

True

手动实例化timedelta时,可以传入的参数有:days, seconds, microseconds, milliseconds, minutes, hours, weeks


五、tzinfo对象


讲解tzinfo(时区)对象前,先了解两个概念:


UTC时间 协调世界时。和GMT(格林尼治平均时间)是一个东西,只不过UTC是通过原子钟测量出来,GMT是通过天文观测出来的,所以UTCGMT精度更高,因此现在世界上不同时区的时间都是以UTC时间为基准,如:北京时间=UTC时间+8小时

DST :夏时令(daylight saving time),因为夏天天亮的早,所以有的国家就在一年的某些时段把时间人为的调快一小时,使人们早睡,减少照明亮,充分利用光照资源,从而节约能源。我国也实行过,不过后来废止了。

tzinfo对象是用来表示该时区相对UTC时间差值,和该地区是否执行夏时令的对象。datetime模块所提供的的tzinfo对象是一个抽象基类,也就是说我们不应该直接实例化此对象, 而应该以此类为基类,定义出子类,然后再实例化以供使用。在子类化的时候,需要自定义很多方法,非常繁琐。还好python提供了一个 pytz 的库,里面自带了适合各个国家和时区的tzinfo对象,我们可以直接使用。


python中,我们把tzinfo为空的datetime对象称为是aware(觉醒)的,把tzinfo不为空的datetime对象称为naive(幼稚)的。使用datetime模块时,除非手动指定tzinfo属性,否则,创建出来的datatime对象tzinfo属性都默认为空。


aware 对象具有关于应用规则和时间调整的充分的信息,例如时区和夏令时信息,来定位相对其他aware 对象的位置。aware对象用于表示时间的一个特定的时刻,它是明确无二的。


naive 对象没有充分的信息来明确地相对其他日期/时间定位它自己。一个 naive 对象表示的是世界协调时(UTC)、本地时间还是其它时区的时间完全取决于程序,就像一个特定的数字表示的是米、英里还是质量一样。


>>> from datetime import datetime

>>> import pytz

>>> utc_tz = pytz.timezone('UTC')

>>> china_tz = pytz.timezone('China/Shanghai')

>>> local_naive = datetime.now()

>>> local_naive

datetime.datetime(2016, 12, 18, 8, 8, 14000)

>>> local_aware = localmoment_aware.replace(china_tz)

datetime.datetime(2016, 12, 18, 8, 8, 14000, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8>

>>> utc_aware = local_aware.astimezone(utc_tz)

>>> utc_aware

datetime.datetime(2016, 12, 18, 0, 8, 14000, tzinfo=<UTC>

>>> utc_aware - local_aware  #虽然时区不同但是表示的同一个时间点

datetime.timedelta(0)


注意,aware类型的datetime对象,只能和aware类型的datetime对象进行运算(相减,大小比较等)。navie类型的datetime对象,只能和naive类型的datetime对象进行运算(相减,大小比较等)。aware类型和naive类型之间运算会报错:


>>> local_naive - local_aware

TypeError:can't subtract offset-naive and offset-aware datetime


来源:简书