Python中的datetime模块的使用

作者: 给我二两面 | 来源:发表于2016-12-18 08:46 被阅读1735次

    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(时区)对象前,先了解两个概念:

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

    相关参考:

    1. python文档中文版-datetime
    2. python文档中文版-time
    3. python文档-pytz

    相关文章

      网友评论

      • dc50f8e14787:您是否是写反了。

        有tzinfo的datetime对象,被称作 aware。
        没有tzinfo的datetime对象,被称作 naive。

      本文标题:Python中的datetime模块的使用

      本文链接:https://www.haomeiwen.com/subject/psvamttx.html