1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Python datetime 模块(datetime 对象的创建 datetime 对象 时间戳 字符串的相互转化)

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

时间:2020-12-20 18:35:37

相关推荐

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

廖雪峰的博客

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。