导航小助手

  • 1. datetime 库概述
  • 2. 拓展: 1970年1月1日
  • 3. datetime 库解析


1. datetime 库概述

以不同格式显示日期和时间是程序中最常用到的功能。Python 提供了一个处理时间的标准函数库 datetime,它提供了一系列由简单到复杂的时间处理方法。datetime 库可以从系统中获得时间,并以用户选择的格式输出。

datetime 库以格林威治时间为基础,每天由 3600X24 秒精准定义。该库包括两个常量:datetime.MINYEARdatetime.MAXYEAR,分别表示 datetime 所能表示的最小、最大年份,值分别为 19999

datetime 库以类的方式提供多种日期和时间表达方式。
(1) datetime.date:日期表示类,可以表示年、月、日等。
(2) datetime.time:时间表示类,可以表示小时、分钟、秒、毫秒等。
(3) datetime.dateime:日期和时间表示的类,功能覆盖 datetime 类。
(4) datetime.timedelta: 与时间间隔有关的类。
(5) datetime.tzinfo:与时区有关的信息表示类。

由于 datetime.daetime 类表达形式最为丰富,这里主要介绍这个类的使用。使用 datetime 类需要用 import 保留字,引用 datetime类的方式如下:

from datetime import datetime

2. 拓展: 1970年1月1日

当代计算机系统都有一个计时功能,能够输出从格林威治标准时间 19701100:00:00 开始到当下的时间计数,精确到秒,这是 UNIX 操作系统早期的设计习惯,后沿用到所有计算机系统中。

现在的计算机硬件和系统都是 64 位,如果用 64 位存储这个时间计数则最大可以表示距离 197011 日开始的 264 秒,1365 天的总秒数约为 1.9x224 ,因此,64 位计算机系统可以将时间表示到约公元 239 年,相信我们的 N 代子孙,哪怕到地球毁灭那天都不用担心时间不准确了。

——为什么选择从 197011 日开始?
——无论选择从哪天开始, 都会有同样的问题, 不是吗?

3. datetime 库解析

datetime 类 ( datetime.datetime 类,以下简称为 datetime 类) 的使用方式是首先创建一个 datetime 对象,然后通过对象的方法和属性显示时间。创建 datetime 对象有3种方法:datetime.now()datetime.utcnow()datetime.datetime()

1.使用 datetime.now() 获得当前日期和时间对象,使用方法如下:

datetime.now()

作用:返回一个 datetime 类型,表示当前的日期和时间,精确到微秒。
参数:无
调用该函数,执行结果如下:

from datetime import datetime
today = datetime.now()
print(today)

2022-05-01 20:32:41.772021

2.使用 datetime utcnow() 获得当前日期和时间对应的 UTC (世界标准时间) 时间对象,使用方法如下:

datetime.utcnow ()

作用:返回一个 datetime 类型,表示当前日期和时间的 UTC 表示,精确到微秒。
参数:无
调用该函数,执行结果如下:

from datetime import datetime
today = datetime.utcnow()
print(today)

2022-05-01 12:35:40.849860

3.datetime.now()datetime utcnow() 都返回一个 datetime 类型的对象,也可以直接使用 datetime() 构造一个日期和时间对象, 使用方法如下:

datetime (year, month, day, hour=0, minute=0,second=0, microsecond=0)

作用:返回一个 datetime 类型,表示指定的日期和时间,可以精确到微秒。

参数如下:

year:指定的年份,MINYEAR <= year <= MAXYEAR

month:指定的月份,1 <= month <= 12

day:指定的日期,1 <= day <=月份所对应的日期上限

hour:指定的小时,0 <= hour < 24

minute:指定的分钟数,0 <= minute < 60

second:指定的秒数,0 <= second < 60

microsecond:指定的微秒数,0 <= microsecond < 1000000

其中,hourminutesecondmicrosecond 参数可以全部或部分省略。

调用 datetime() 函数直接创建一个 datetime 对象,表示 20225120:33327 微妙,执行结果如下:

from datetime import datetime
someday = datetime(2022, 5, 1, 20, 43, 32, 7)
print(someday)

2022-05-01 20:43:32.000007

到此,程序已经有了一个 datetime 对象,进一步可以利用这个对象的属性显示时间,为了区别 datetime 库名,采用上例中的 someday 代替生成的 datetime 对象,常用属性如下表所示。

属性

描述

someday.min

固定返回 datetime 的最小时间对象,datetime(1,1,1,0,0)

someday.max

固定返回 datetime 的最大时间对象,datetime(9999,12,31,23,59,59,59,999999)

someday.year

返回 someday 包含的年份

someday.month

返回 someday 包含的月份

someday.day

返回 someday 包含的日期

someday.hour

返回 someday 包含的小时

someday.minute

返回 someday 包含的分钟

someday.second

返回 someday 包含的秒钟

someday.microsecond

返回 someday 包含的微妙值

datetime 对象有 3 个常用的时间格式化方法,如下表所示

属性

描述

someday.isoformat()

采用 ISO 8601 标准显示时间

someday.isoweekday()

根据日期计算星期后返回 1~7,对应星期一到星期日

someday.strftime(format)

根据格式化字符串 format 进行格式显示的方法

isoformat()isoweekday() 方法的使用如下:

from datetime import datetime
today = datetime.now()
print(today.isoformat())
print(today.isoweekday())

程序执行结果如下:

2022-05-01T21:00:28.392304
7

strftime() 方法是时间格式化最有效的方法,几乎可以以任何通用格式输出时间。例如下面的例子,用该方法输出特定格式时间。

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

程序执行结果如下:

2022-05-01 21 : 04 : 23

下表是 strftime() 方法的格式化控制符。

格式化字符串

日期/时间

值范围和实例

%Y

年份

0001~9999

%m

月份

01~12

%B

月名

January~December

%b

月名缩写

Jan~Dec

%d

日期

01~31

%A

星期

Monday~Sunday

%a

星期缩写

Mon~Sun

%H

小时(24 h 制)

00~23

%M

分钟

00~59

%S


00~59

%x

日期

月/日/年,例如,01/01/2022

%X

时间

时 :分:秒,例如,19 : 09 : 31

strftime() 格式化字符串的数字左侧会自动补零,上述格式也可以与 print() 的格式化函数起使用,例如:

from datetime import datetime

now = datetime.now()

print(now.strftime("%Y- %m- %d"))

print(now.strftime("%A,%d. %B %Y %H: %M%p"))

print("今天是 {0:%Y} 年 {0:%m} 月 {0:%d} 日".format(now))

程序执行结果如下:

2022- 05- 01
Sunday,01. May 2022 21: 21PM
今天是 2022 年 05 月 01 日

datetime 库主要用于对时间的表示,从格式化角度掌握 strftime() 函数已经能够处理很多情况了。建议读者在遇到需要处理时间的问题时采用 datetime 库,简化格式输出和时间的维护。

🧸这次的分享就到这里啦,继续加油哦^^
🍭有出错的地方欢迎在评论区指出来,共同进步,谢谢啦