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, day。date对象是没有时区(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, second,microsecond, 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(时区)对象前,先了解两个概念:
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(责任编辑:好模板) |