Python 时间模块 datetime

版权声明:本文为博主原创文章,欢迎讨论共同进步。 https://blog.csdn.net/tz_zs/article/details/81672280

____tz_zs
datetime是Python处理日期和时间的标准库。我们常使用的是 datetime 模块中的 datetime 类。

datetime 对象

datetime(year, month=None, day=None, hour=0, minute=0, second=0,
microsecond=0, tzinfo=None)

构造 datetime 对象,至少需要填入 3 个参数 year、month、day。

属性 tzinfo 为时区信息,默认为None,可输入的类型为 timezone 对象(详情见下文)。

datetime 对象的创建

#!/usr/bin/python2.7
# -*- coding:utf-8 -*-

"""
@author:    tz_zs
"""

from datetime import datetime

datetime_now = datetime.now() # 创建当前时间的 datetime 对象
print(datetime_now)  # 2018-08-07 15:11:44.255590
print(type(datetime_now))  # <class 'datetime.datetime'>

dt = datetime(2018, 8, 3, 15, 30)  # 用指定日期时间创建 datetime 对象
print(dt)  # 2018-08-03 15:30:00
print(type(dt))  # <class 'datetime.datetime'>

datetime 对象的加减

datetime 对象的加减与类 timedelta 息息相关。

from datetime import timedelta

dt1 = datetime(2018, 8, 3, 15, 30)  # 用指定日期时间创建datetime
dt2 = datetime(2018, 8, 2, 10, 00)

td = timedelta(days=0, seconds=0, microseconds=0,
               milliseconds=0, minutes=0, hours=10, weeks=0)  # 创建一个 timedelta 对象, <class 'datetime.timedelta'>

1、datetime 对象 与 timedelta 对象

# datetime 加减 timedelta 得到新的 datetime
new_dt = dt1 + td
print(new_dt)  # 2018-08-04 01:30:00
print(type(new_dt))  # <class 'datetime.datetime'>

2、datetime 对象之间相减

# datetime 之间相减会的到一个 timedelta 对象
dt_sub = dt1 - dt2
print(dt_sub)  # 1 day, 5:30:00
print(type(dt_sub))  # <class 'datetime.timedelta'>

datetime 对象的时区属性 tzinfo

创建时区对象 timezone

由 timezone 的构造函数可知,输入的 offset 必须为 timedelta 对象。所以,时区信息对象的

class timezone(tzinfo):
    __slots__ = '_offset', '_name'

    # Sentinel value to disallow None
    _Omitted = object()
    def __new__(cls, offset, name=_Omitted):
        if not isinstance(offset, timedelta):
            raise TypeError("offset must be a timedelta")
        ......
        ......
        ......

示例代码

#!/usr/bin/python2.7
# -*- coding:utf-8 -*-

"""
@author:    tz_zs
"""

from datetime import datetime
from datetime import timedelta
from datetime import timezone

# 创建时区对象
td = timedelta(hours=8)  # timedelta 对象
tz = timezone(td)  # 时区对象

d1 = datetime(2018, 8, 3, 15, 30)
print(d1)  # 2018-08-03 15:30:00

d2 = datetime(2018, 8, 3, 15, 30, tzinfo=tz)
print(d2)  # 2018-08-03 15:30:00+08:00

d3 = d1.replace(tzinfo=tz)
print(d3)  # 2018-08-03 15:30:00+08:00

# 时区转化
# 东8区转化为东9区
dt_9 = d2.astimezone(tz=timezone(timedelta(hours=9)))
print(dt_9)  # 2018-08-03 16:30:00+09:00

# 东8区转化为0时区
dt_utc = d2.astimezone(tz=timezone(timedelta(hours=0)))
print(dt_utc)  # 2018-08-03 07:30:00+00:00

# datetime 的 tzinfo 属性为 None 则转化会报错。
dt_9 = d1.astimezone(timezone(timedelta(hours=9)))
print(dt_9)
"""
Traceback (most recent call last):
  File
  ......
  ......
    dt_9 = d1.astimezone(timezone(timedelta(hours=9)))
ValueError: astimezone() cannot be applied to a naive datetime
"""

timestamp

Unix时间戳(Unix timestamp),也被称为Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。

因此,严格来说,不管你处在地球上的哪个地方,任意时间点的时间戳都是相同的。这点有利于线上和客户端分布式应用统一追踪时间信息。

注意到timestamp是一个浮点数,它没有时区的概念,而datetime是可以有时区的(tzinfo 属性)。

datetime 转换为 timestamp

# datetime 转换为 timestamp (格式:<class 'float'>)
ts = dt.timestamp()
print(ts)  # 1533281400.0

timestamp 转换为 datetime

fromtimestamp 是将 timestamp 转化为本地时间的 datetime 对象,但得到的 datetime 对象的 tzinfo 属性仍为 None。

# timestamp 转换为 datetime
fts = datetime.fromtimestamp(ts)
print(fts)  # 2018-08-03 15:30:00
print(type(fts))  # <class 'datetime.datetime'>

utcfromtimestamp 直接将 timestamp 转换到UTC标准时区的 datetime 对象。得到的 datetime 对象的 tzinfo 属性也为 None。

# timestamp 也可以直接被转换到UTC标准时区的时间
utc_fts = datetime.utcfromtimestamp(ts)
print(utc_fts)  # 2018-08-03 07:30:00

字符串格式的时间与 datetime 的相互转化

str 转换为 datetime对象

datetime.strptime(str,解析的样式)

datetime对象转换为 str

datetime对象.strftime(格式化的样式)

#####################################################
# str 转换为 datetime
dt_spt = datetime.strptime("2018-08-03 15:30:00", "%Y-%m-%d %H:%M:%S")
print(dt_spt)  # 2018-08-03 15:30:00
print(type(dt_spt))  # <class 'datetime.datetime'>

#####################################################
# datetime 转换为 str
str = dt_spt.strftime(format="%Y-%m-%d %H:%M:%S")
print(str)  # 2018-08-03 15:30:00
print(type(str))  # <class 'str'>

参考:
https://docs.python.org/3/library/datetime.html#module-datetime
https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
https://docs.python.org/3/library/datetime.html
廖雪峰的博客

猜你喜欢

转载自blog.csdn.net/tz_zs/article/details/81672280