Python datetime 模块(datetime 对象的创建,datetime 对象、时间戳、字符串的相互转化)

____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))  # 

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

# 计算机起点时间的 datetime 对象
datetime(1970, 1, 1)  # 1970-01-01 00:00:00
datetime.utcfromtimestamp(0)  # 1970-01-01 00:00:00
datetime.fromtimestamp(0)  # 1970-01-01 08:00:00

(二)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 对象, 

1、datetime 对象 与 timedelta 对象

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

2、datetime 对象之间相减

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

3、timedelta 一周与7天无区别

print(timedelta(weeks=1) == timedelta(days=7))  # True。均为 7 days, 0:00:00

(三)datetime 对象的时区属性 tzinfo

1、创建时区对象 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
"""

例:指定时区对象为 0 时区,获取当前时刻 0 时区的时间

import datetime

datetime.datetime.now(tz=datetime.timezone(datetime.timedelta(hours=0))).strftime("%Y-%m-%dT%H:%M:%S")

# 等同
datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S")

二、timestamp

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

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

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

(一)datetime 对象 ⇌ timestamp 时间戳

1、datetime 对象转换为 timestamp 时间戳

对于 Python 3 可以方便的使用 datetime 对象的方法 timestamp()

# datetime 转换为 timestamp (格式:)
ts = dt.timestamp()
print(ts)  # 1533281400.0

对于 Python 2 ,我们需自己计算

from datetime import datetime
from datetime import timedelta

dt = datetime(2018, 8, 3, 15, 30, 45, 898632)  # 2018-08-03 15:30:45.898632
# td = dt - datetime(1970, 1, 1) - timedelta(hours=8)  # 我们是 8 时区。 17746 days, 7:30:45.898632
td = dt - datetime.fromtimestamp(0)  # 17746 days, 7:30:45.898632

timestamp = td.total_seconds()
print(timestamp)  # 1533281445.898632

timestamp = td.microseconds + (td.seconds + td.days * 86400) * 10 ** 6
print(timestamp)  # 1533281445898632

参考:https://stackoverflow.com/questions/30020988/python3-datetime-timestamp-in-python2

2、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))  # 

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(格式化的样式)

1、str 转换为 datetime

str 转换为 datetime对象

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

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))  # 

2、datetime 转换为 str

datetime对象转换为 str

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

s1 = dt_spt.strftime("%Y-%m-%d %H:%M:%S")
print(s1)  # 2018-08-03 15:30:00
print(type(s1))  # 

datetime对象.isoformat()

s2 = dt_spt.isoformat()
print(s2)  # 2018-08-03T15:30:00
print(type(s2))  # 

s3 = dt_spt.isoformat(sep=" ")
print(s3)  # 2018-08-03 15:30:00
print(type(s3))  # 

其他常用的时间字符串格式

s = dt_spt.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
print(s)  # 2018-08-03T15:30:00.000000Z
print(type(s))  # 

s = dt_spt.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z"
print(s)  # 2018-08-03T15:30:00.000Z
print(type(s))  # 

参考:
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
廖雪峰的博客

你可能感兴趣的:(#,综合)