____tz_zs
datetime是Python处理日期和时间的标准库。我们常使用的是 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 对象(详情见下文)。
#!/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 对象的加减与类 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
由 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")
Unix时间戳(Unix timestamp),也被称为Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。
因此,严格来说,不管你处在地球上的哪个地方,任意时间点的时间戳都是相同的。这点有利于线上和客户端分布式应用统一追踪时间信息。
注意到timestamp是一个浮点数,它没有时区的概念,而datetime是可以有时区的(tzinfo 属性)。
对于 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
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
str 转换为 datetime对象
datetime.strptime(str,解析的样式)
datetime对象转换为 str
datetime对象.strftime(格式化的样式)
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)) #
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
廖雪峰的博客