山地人

Python 时间和日期(Datetime)

山地人
山地人
2021-07-19

时间和日期

Python中提供了两个和时间日期相关的模块timecalendar以及datetime

这一篇,我们重点来讲datetime

获取当前时间

要获取当前的本地时间,需要是用datetime模块中的datetime类提供的now函数。

now = datetime.now(tz=None)
  • tz是转换的时区,默认设置为None,表示获取本地时区。
  • now函数追中返回表示当前地方时的datetime对象。

首先导入datetime模块,然后使用。

import datetime
datetime.datetime.now()

也可以用另外一种直接导入类的方式,让调用代码变短一些。

from datetime import datetime
now = datetime.now()

运行沙盒,观察运行结果。

创建datetime对象

除了获取表示系统当前日期时间的datetime对象,你可以创建指定日期和时间的datetime对象。

from datetime import datetime
dt = datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])
  • datetime是一个类,我们可以使用这个类来创建自定义的datetime对象。
  • year, month, day年月日是三个必传递参数。
  • 后面的hour,minute,second,microsecond,tzinfo都是可选参数。

下面是一个具体的使用例子:

from datetime import datetime
dt = datetime(2021, 7, 2, 8, 10, 30)
print(dt)

运行沙盒,观察运行结果。

datetime中的方法

既然datetime是一个类,这个类中就存在一些有用的函数。

分别获取datetime中的日期和时间部分

from datetime import datetime
dt = datetime(2021, 7, 2, 8, 10, 30)
# 获取date对象
dt.date()
# 获取time对象
dt.time()
# 获取时间戳
dt.timestamp()

运行沙盒,观察运行结果。

datetime和其他类型的相互转换

有时候,我们需要把一个字符串格式的时间,或者一个时间戳转换成datetime类型的对象,或者反过来把datetime转换成一个字符串。下面我们看看这些类型之间是如何进行转换的。

datetime转成字符串

datetime对象装换成字符串。可以使用datetime对象上的strftime(format)方法。

这里的format你可以设置转换的格式,下面是一张可以使用的常用格式的表:

指令含义示例
%w以十进制数显示的工作日,其中0表示星期日,6表示星期六。0, 1, …, 6
%d补零后,以十进制数显示的月份中的一天。01, 02, …, 31
%m补零后,以十进制数显示的月份。01, 02, …, 12
%y补零后,以十进制数表示的,不带世纪的年份。00, 01, …, 99
%Y十进制数表示的带世纪的年份。0001, 0002, …, 2013, 2014, …, 9998, 9999
%H以补零后的十进制数表示的小时(24 小时制)。00, 01, …, 23
%I以补零后的十进制数表示的小时(12 小时制)。01, 02, …, 12
%p本地化的 AM 或 PM 。AM, PM (en_US); am, pm (de_DE)
%M补零后,以十进制数显示的分钟。00, 01, …, 59
%S补零后,以十进制数显示的秒。00, 01, …, 59
%j以补零后的十进制数表示的一年中的日序号。001, 002, …, 366
%W以十进制数表示的一年中的周序号(星期一作为每周的第一天)。 在新的一年中第一个第期一之前的所有日子都被视为是在第 0 周。00, 01, …, 53
%%字面的 ’%’ 字符。%

更加完整的字符串格式说明,请点击此处请查看Python官方文档

使用这些格式指令,可以将datetime格式化成你需要的字符串。

from datetime import datetime
now = datetime.now()
print(now.strftime("%Y-%m-%d %H:%M:%S"))

运行沙盒,观察运行结果。

字符串转成datetime

反过来,你也可以使用datetime.strptime将字符串转换为datetime对象。

datetime.strptime(str, format)
  • str是要被转换的字符串格式的日期
  • format是提供转换的格式化字符串
from datetime import datetime
dt = datetime.strptime('2021-7-20 9:08:19', '%Y-%m-%d %H:%M:%S')
print(dt)

运行沙盒,观察运行结果。

时间戳转成datetime

对于收到的时间戳使用datetime.fromtimestamp(t)转换成datetime类型的对象。

需要注意的是这里的时间戳接收的整数部分是以秒为单位的。如果时间戳是从其他语言获取到的,比如:

javascript的Date.now()获得的时间戳1626743939450是以毫秒为单位的,需要除以1000换算为秒为单位1626743939.45。然后送入datetime.fromtimestamp(1626743939.45)进行转换。

运行沙盒,观察运行结果。

时区转换

对于不同时区的时间,我们需要进行时区转换后才能使用,比如获取的是UTC时间(世界协调时间,UTC + 00:00),如果我们想要知道这个时间对应的北京时间(北京,UTC + 8:00),就需要进行时区转换。

from datetime import datetime,timezone,timedelta
# 获取UTC时间
utc_now = datetime.utcnow()
# 将UTC时间 强制转换为UTC + 00:00 时区的时间
utc_zero = utc_now.replace(tzinfo=timezone.utc).astimezone(tz=None)
# 将UTC 0时区时间转换为北京时间
beijing_now = utc_zero.astimezone(timezone(timedelta(hours=8)))
  • datetime.utcnow()返回的是当前utc时间,但其内部不带tzinfo时区信息
  • utc_zero第二行的代码作用是将这个utc时间转换为带UTC 0时区信息的时间
    • utc_now.replace(tzinfo=timezone.utc)utc_now设置utc时区
    • 利用astimezone(tz=None)返回一个具有tzinfo属性tz的新datetime对象。
    • 最后利用astimezone设置新的时区,来返回指定时区的datetime,达到转换时区的目的。

运行沙盒,观察运行结果。

上面的时区转换写法相对复杂,下面的版本对其进行简化:

from datetime import datetime,timezone,timedelta
# 创建带UTC 0时区信息的当前时间
utc_zero = datetime.now(timezone.utc)
# 将UTC 0时区时间直接转换为北京时间
beijing_now = utc_zero.astimezone(timezone(timedelta(hours=8)))

如果我们直接创建带有UTC时区信息的时间,就可以省略一步手工创建带时区的datetime的步骤。

运行沙盒,观察运行结果。

至此,本篇教程也到了该和你说再见的时候了,我们下期再见。

学完本篇互动教程,如果你觉得体验不错,可以把网页链接发送给你的小伙伴,让他/她也来感受一下。当然,你也可以继续看看网站上其他的的互动教程,希望`idev365`能够给你带来收获。

学习教程的过程中碰到了问题,或者对idev365有什么改进意见和想法,欢迎加入idev365微信内测群,和山地人交流你的想法。