谈谈对python中的日期、时间、时区的理解(2)

本文深入讲解Python中的datetime模块,涵盖日期、时间、时区的概念,以及如何使用datetime、date、time类进行时间戳转换和字符串格式化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇博客谈谈对python中的日期、时间、时区的理解_1 了解时间相关的概念

要想在python中通过代码来处理和转换时间,还需要再学习一下python的内置标准模块datatime

DATETIME标准模块

学习datetime模块,参考的资料是什么呢?还是那句话,最好的学习资料就是官方文档。我的参考python3.7的官方文档

datetime模块提供了几个处理日期和时间的类

在介绍具体的类之前,需要先解释一下文档中的两个 概念 ‘aware’ 和 ‘naive’,有助于我们对文档的理解

Date and time objects may be categorized as “aware” or “naive” depending on whether or not they include timezone information.

简单来说,通过 对象(Date and time objects)是否 包含 时区信息 来判断 该对象是 “aware” 还是 ”naive“。”aware“可以理解为包含时区信息的对象,"naive"可以理解为不包含时区信息的对象。其实从这两个单词本身含义的角度也可以这样理解,“aware”是感知的意思,那么它"感知"啥呢?就是"感知"时区等信息;“naive”是单纯、天真的意思,说明它只是纯粹的表示一个日期或时间点,与时区等其他信息无关。

datetime模块有6大类

  1. datetime.date 表示日期,通常为 年 月 日。date对象是"naive"的

  2. datetime.time 表示时间,通常为 时 分 秒 微秒 时区。

  3. datetime.datetime 表示时间和日期,通常为 年 月 日 时 分 秒 微秒 时区

  4. datetime.timedelta 表示时差, 通常为两个datetime.date实例或两个datetime.time实例或两个datetime.datetime实例的时差

  5. datetime.tzinfo 是一个时区信息的抽象基类,通常用于datetime.time和datetime.datetime,来提供时区信息。

  6. datetime.timezone 是datetime.tzinfo的派生类,表示相对于UTC的一个固定时区偏移。

    注意:

    1. 这6大类的对象都是不可变对象(immutable);
    2. datetime.time和datetime.datetime 如果不包含时区信息,就是“naive”的;如果包含时区信息,就是"aware"的;
    3. timedelta对象没有 “aware”或“naive”的概念;

6大类的类间关系

object
    timedelta
    tzinfo
        timezone
    time
    date
        datetime

在实际应用中,我们要怎样使用datetime模块来记录日期时间呢?

class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, , fold=0)
The year, month and day arguments are required
. tzinfo may be None, or an instance of a tzinfo subclass.
The remaining arguments must be integers in the following ranges:
• MINYEAR <= year <= MAXYEAR,
• 1 <= month <= 12,
• 1 <= day <= number of days in the given month and year,
• 0 <= hour < 24,
• 0 <= minute < 60,
• 0 <= second < 60,
• 0 <= microsecond < 1000000,
• fold in [0, 1].

说明:datetime.datetime 第一个datetime是指模块名, 第二个datetime是类名**

# 使用datetime构造一个日期时间
dt = datetime(2020, 5, 28, 14, 30, 5)
print(dt) # 输出是 2020-05-28 14:30:05

常用场景

获取当前时间

# classmethod datetime.today()
# datetime.today() 获取日期时间,包含本地时区信息
print(datetime.today())

# classmethod datetime.now(tz=None)
# datetime.now() 获取日期时间,可以通过tz参数指定时区,如果使用默认参数的话,和today()函数一样
print(datetime.now())

# classmethod datetime.utcnow()
# utcnow() 获取UTC日期时间,不包含时区信息, 返回一个"naive"的datetime object
print(datetime.utcnow())

第3行打印输出为 2020-05-29 18:04:35.771736
第7行打印输出为 2020-05-29 18:04:35.771736
第11行打印输出为 2020-05-29 10:04:35.771736

因为中国在东八区,所以本地时间 为UTC时间 再+8小时。

时间戳转换为日期时间字符串

通常分为两个步骤:timestamp —> datetime —> str

a. 时间戳 转为 datetime对象

​ 时间戳 转为 datetime对象 有两种方法.

​ 方法一:
classmethod datetime.fromtimestamp(timestamp, tz=None)
​ 将时间戳 转换为 本地datetime对象,如果tz没有指定,默认为None,datetime对象将表示代码运行平台的本地日期时间, 是aware的。
​ 可以理解为将时间戳转换为本地时间。

timestamp = 1590716670
dt = datetime.fromtimestamp(timestamp)
print(dt) # 输出结果为:2020-05-29 09:44:30

​ 方法二:
classmethod datetime.utcfromtimestamp(timestamp)
​ 将时间戳 转换为 UTC datetime对象, 返回的datetime对象表示UTC时间, 是naive的
​ 可以理解为将时间戳转换为UTC时间

timestamp = 1590716670
dt = datetime.utcfromtimestamp(timestamp)
print(dt) # 输出结果为:2020-05-29 01:44:30

b. datetime对象 格式化成 日期时间字符串

​ datetime提供了2个常用的实例方法,用于将datetime对象 转换为 指定格式的 日期时间字符串

datetime.isoformat(sep=’T’, timespec=’auto’)*
​ isoformat()参数一般默认就好了
​ 如果datetime实例有微秒信息,输出的格式 YYYY-MM-DDTHH:MM:SS.ffffff
​ 如果datetime实例没有微秒信息,输出的格式 YYYY-MM-DDTHH:MM:SS
​ 如果datetime实例有时区信息,输出的格式为 YYYY-MM-DDTHH:MM:SS[.ffffff]+HH:MM[:SS[.ffffff]]

tz = timezone(timedelta(hours=8)) 					# 设置时区为东8区
dt = datetime(2020, 5, 28, 14, 30, 5, tzinfo=tz)	# 构造一个datetime对象
print(dt.isoformat()) # 获取iso格式的日期时间字符串,输出结果为:2020-05-28T14:30:05+08:00

datetime.ctime()*

​ 输出格式为

print(dt.ctime())  # 输出结果为:Thu May 28 14:30:05 2020

datetime提供了1个实例方法,允许自定义格式,将datetime对象 转为日期时间字符串,这种方式给与程序员编码更大的灵活性

datetime.strftime(format)

​ 自定义日期、时间、时区 显示格式, 具体格式的定义参考strftime() and strptime() Behavior

# 输出iso格式的日期时间字符串
print(dt.strftime("%Y-%m-%dT%H:%M:%S%Z")) # 输出结果为 2020-05-28T14:30:05UTC+08:00
print(dt.strftime("%Y-%m-%dT%H:%M:%S%z")) # 输出结果为 2020-05-28T14:30:05+0800

# 输出ctime格式的日期时间字符串
print(dt.strftime("%a %b %d %H:%M:%S %Y")) # 输出结果为 Thu May 28 14:30:05 2020

时间日期字符串转为时间戳

在实际的项目,如果涉及到全球性的业务,就需要准确的表示时间信息。有时候我们直接拿到的日期时间信息会是不同格式的字符串,在系统内部进行时间处理时,要先将不同格式的字符串转换成统一的时间信息(如时间戳,时区),然后再由系统内部进行处理。那么,代码层面要怎么做呢?

我们常常获取到的字符串时间信息,例如,“2020-05-18T14:15:56+01:00”。根据前面介绍的知识点做出猜想,如果可以将字符串转为datetime对象,那么,就能完成 “将不同格式的字符串转换成统一的时间信息”的需求。是否可行呢?答案时肯定的。

datetime提供了一个类方法(strptime)来帮助我们处理字符串

classmethod datetime.strptime(date_string, format)

iso_time_str = '2020-05-18T14:15:56+01:00'  # 这里假定一个iso格式的日期时间字符串(包含时区)
dt = datetime.strptime(iso_time_str,"%Y-%m-%dT%H:%M:%S%z") # 将字符串按照iso格式转换成datetime对象
print(dt)				# dt打印输出结果:2020-05-18 14:15:56+01:00
print(dt.timestamp())	# 时间戳:1589807756.0
print(dt.tzname())		# 时区信息: UTC+01:00
print(dt.tzinfo)		# 时区信息: UTC+01:00
print(datetime.utcfromtimestamp(dt.timestamp())) # UTC 时间输出:2020-05-18 13:15:56

结语,通过这两篇文章的分析,理解了理论,基于python也能动手实践,以后不管什么形式的时间信息,都能游刃有余的处理。如果有啥不清楚的,欢迎评论下方讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sif_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值