____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 datetimedatetime_now = datetime.now() # 创建当前时间的 datetime 对象print(datetime_now) # -08-07 15:11:44.255590print(type(datetime_now)) # <class 'datetime.datetime'>dt = datetime(, 8, 3, 15, 30) # 用指定日期时间创建 datetime 对象print(dt) # -08-03 15:30:00print(type(dt)) # <class 'datetime.datetime'># 计算机起点时间的 datetime 对象datetime(1970, 1, 1) # datetime.datetime(1970, 1, 1, 0, 0)。1970-01-01 00:00:00datetime.utcfromtimestamp(0) # utc时区,datetime.datetime(1970, 1, 1, 0, 0)。1970-01-01 00:00:00datetime.fromtimestamp(0) # 本地主机时区,datetime.datetime(1970, 1, 1, 8, 0)。1970-01-01 08:00:00
(二)datetime 对象的加减
datetime 对象的加减与类 timedelta 息息相关。
from datetime import timedeltadt1 = datetime(, 8, 3, 15, 30) # 用指定日期时间创建datetimedt2 = datetime(, 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 得到新的 datetimenew_dt = dt1 + tdprint(new_dt) # -08-04 01:30:00print(type(new_dt)) # <class 'datetime.datetime'>
2、datetime 对象之间相减
# datetime 之间相减会的到一个 timedelta 对象dt_sub = dt1 - dt2print(dt_sub) # 1 day, 5:30:00print(type(dt_sub)) # <class 'datetime.timedelta'>
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")..................
示例代码
例1:创建时区对象、时区转化
#!/usr/bin/python2.7# -*- coding:utf-8 -*-"""@author: tz_zs"""from datetime import datetimefrom datetime import timedeltafrom datetime import timezone# 【创建时区对象】td = timedelta(hours=8) # timedelta 对象,8小时tz = timezone(td) # 时区对象d1 = datetime(, 8, 3, 15, 30) # 无时区信息print(d1) # -08-03 15:30:00d2 = datetime(, 8, 3, 15, 30, tzinfo=tz) # 携带时区信息的 datetime 对象print(d2) # -08-03 15:30:00+08:00d3 = d1.replace(tzinfo=tz) # 增加时区信息print(d3) # -08-03 15:30:00+08:00# 【时区转化】# 东8区转化为东9区dt_9 = d2.astimezone(tz=timezone(timedelta(hours=9)))print(dt_9) # -08-03 16:30:00+09:00# 东8区转化为0时区dt_utc = d2.astimezone(tz=timezone(timedelta(hours=0)))print(dt_utc) # -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"""
例2:指定时区对象为 0 时区,获取当前时刻 0 时区的时间
import datetimedatetime.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 (格式:<class 'float'>)ts = dt.timestamp()print(ts) # 1533281400.0
对于Python 2
,我们需自己计算
from datetime import datetimefrom datetime import timedeltadt = datetime(, 8, 3, 15, 30, 45, 898632) # -08-03 15:30:45.898632# td = dt - datetime(1970, 1, 1) - timedelta(hours=8) # 我们是 8 时区。 17746 days, 7:30:45.898632td = dt - datetime.fromtimestamp(0) # 17746 days, 7:30:45.898632timestamp = td.total_seconds()print(timestamp) # 1533281445.898632timestamp = td.microseconds + (td.seconds + td.days * 86400) * 10 ** 6print(timestamp) # 1533281445898632
参考:/questions/30020988/python3-datetime-timestamp-in-python2
2、timestamp 时间戳转换为 datetime 对象
fromtimestamp
是将 timestamp 转化为本地(主机)时区的 datetime 对象,但得到的 datetime 对象的 tzinfo 属性仍为 None。
# timestamp 转换为 datetimefts = datetime.fromtimestamp(ts)print(fts) # -08-03 15:30:00print(type(fts)) # <class 'datetime.datetime'>
utcfromtimestamp
直接将 timestamp 转换到UTC标准时区的 datetime 对象。得到的 datetime 对象的 tzinfo 属性也为 None。
# timestamp 也可以直接被转换到UTC标准时区的时间utc_fts = datetime.utcfromtimestamp(ts)print(utc_fts) # -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("-08-03 15:30:00", "%Y-%m-%d %H:%M:%S")print(dt_spt) # -08-03 15:30:00print(type(dt_spt)) # <class 'datetime.datetime'>
2、datetime 转换为 str
datetime 对象转换为指定格式的字符串
datetime对象.strftime(格式化的样式)
s1 = dt_spt.strftime("%Y-%m-%d %H:%M:%S")print(s1) # -08-03 15:30:00print(type(s1)) # <class 'str'>
datetime对象.isoformat()
s2 = dt_spt.isoformat()print(s2) # -08-03T15:30:00print(type(s2)) # <class 'str'>s3 = dt_spt.isoformat(sep=" ")print(s3) # -08-03 15:30:00print(type(s3)) # <class 'str'>
其他常用的时间字符串格式
s = dt_spt.strftime("%Y-%m-%dT%H:%M:%S.%fZ")print(s) # -08-03T15:30:00.000000Zprint(type(s)) # <class 'str'>s = dt_spt.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z"print(s) # -08-03T15:30:00.000Zprint(type(s)) # <class 'str'>
参考:
/3/library/datetime.html#module-datetime
/3/library/datetime.html#strftime-strptime-behavior
/3/library/datetime.html
廖雪峰的博客