介绍

Python 内置了多种实用的对象供开发者直接使用,日期对象(Date Object)便是其中之一。由于日期和时间的复杂性,从头实现日期处理逻辑往往十分困难。所幸,Python 的日期对象将日期转换为所需字符串格式的过程变得相当简单。

日期格式化是程序员的重要任务之一。不同地区表示日期和时间的方法各不相同,因此,以用户可读的方式显示日期值是开发中的常见目标。

例如,你可能需要用数字格式表示日期,如 02-23-2018;另一方面,你可能需要以更长的文本格式表示相同的日期,如 Feb 23, 2018。在某些情况下,你可能还希望从数字格式的日期值中提取出字符串格式的月份。

在本文中,我们将研究不同类型的日期对象及其功能。

datetime 模块

正如你所猜到的,Python 的 datetime 模块包含可用于处理日期和时间值的方法。要使用这个模块,我们需要先通过以下 import 语句将其导入:

import datetime

我们可以使用 time 类表示时间值。时间类的属性包括小时、分钟、秒和微秒。

time 类的参数是可选的。尽管不指定任何参数你将获得零点时间对象,但这大多数时候不太可能是你需要的。

例如,要初始化值为 1 小时、10 分钟、20 秒、13 微秒的时间对象,我们可以运行以下命令:

t = datetime.time(1, 10, 20,13)

让我们使用 print 函数来查看时间:

print(t)

输出:

01:10:20.000013

你可能只需要查看小时、分钟、秒或者微秒,可以像下面这么做:

print('hour:', t.hour)

输出:

hour: 1

可以按照如下方式检索上述时间对象的分钟、秒或者微秒:

print('Minutes:', t.minute)
print('Seconds:', t.second)
print('Microsecond:', t.microsecond)

输出:

Minutes: 10
Seconds: 20
Microsecond: 13

日历日期可以通过 date 类表示。示例具有的属性有年、月和日。

让我们来调用 today 方法来查看今天的日期:

import datetime

today = datetime.date.today()
print(today)

输出:

2018-09-15

代码将返回今天的日期,因此你看到的输出取决于你运行脚本的日期。

现在我们调用 ctime 方法以另一种格式打印日期:

print('ctime:', today.ctime())

输出:

ctime: Sat Sep 15 00:00:00 2018

ctime 方法会使用比我们之前看到的示例更长的日期时间格式。此方法主要用于将 Unix 时间(从 1970 年 1 月 1 日以来的秒数)转换为字符串格式。

以下是我们如何使用 date 类显示年份、月份和日期:

print('Year:', today.year)
print('Month:', today.month)
print('Day :', today.day)

输出:

Year: 2018
Month: 9
Day : 15

使用 strftime 将日期转换为字符串

既然你已经知道如何创建时间和日期对象,那么让我们学习如何将它们格式化为更易读的字符串。

为此,我们将使用 strftime 方法。这个方法可以帮助我们将日期对象转换为可读字符串。它通常在日期对象上直接调用,语法如下所示:

object.strftime(format)

参数 format 是格式字符串,用于指定以何种格式显示时间日期。

这个方法也可以在 datetime 对象上直接调用。如以下示例所示:

import datetime

x = datetime.datetime(2018, 9, 15)

print(x.strftime("%b %d %Y %H:%M:%S"))

输出:

Sep 15 2018 00:00:00

我们使用以下字符串来格式化日期:

  • %b: 返回月份名称的前三个字符。在我们的例子中,它返回 "Sep"。
  • %d: 返回本月的日期,从 1 到 31。在我们的例子中,它返回 "15"。
  • %Y: 返回四位数格式的年份。在我们的例子中,它返回 "2018"。
  • %H: 返回小时。在我们的例子中,它返回 "00"。
  • %M: 返回分钟,从 00 到 59。在我们的例子中,它返回 "00"。
  • %S: 返回秒,从 00 到 59。在我们的例子中,它返回 "00"。

我们没有时间对象,因此时间值都是 "00"。下面的例子显示了如何格式化时间:

import datetime

x = datetime.datetime(2018, 9, 15, 12, 45, 35)

print(x.strftime("%b %d %Y %H:%M:%S"))

输出:

Sep 15 2018 12:45:35

常用格式化代码

除了上面给出的字符串外,strftime 方法还使用了其他几个指令来格式化日期值:

代码含义示例
%a返回工作日的前三个字符Wed
%A返回工作日的全名Wednesday
%B返回月份的全名September
%w返回工作日作为数字,从 0 到 6,周日为 00-6
%m将月份作为数字返回,从 01 到 1201-12
%p返回 AM/PM 标识AM/PM
%y返回两位数格式的年份18
%Y返回四位数格式的年份2018
%f返回从 000000 到 999999 的微秒000000-999999
%Z返回时区UTC/CST
%z返回 UTC 偏移量+0800
%j返回当年的日期编号,从 001 到 366001-366
%W返回年份的周数,从 00 到 53。星期一被记为一周第一天00-53
%U返回年份的周数,从 00 到 53。星期日被记为一周第一天00-53
%c返回本地日期和时间版本-
%x返回本地日期版本-
%X返回本地时间版本-
注意:关于工作日的翻译。原文中的 "weekday" 在某些语境下可能被翻译为“工作日”,但在 Python datetime 中,它指代一周中的某一天(周一至周日)。例如 %A 可能返回 'Sunday'。

请考虑以下示例:

import datetime

x = datetime.datetime(2018, 9, 15)

print(x.strftime('%b/%d/%Y'))

输出:

Sep/15/2018

以下是你只获取月份的方法:

print(x.strftime('%B'))

输出:

September

让我们只展示年份:

print(x.strftime('%Y'))

输出:

2018

在这个例子中,我们使用了格式化代码 %Y。请注意,它的 Y 是大写的,现在使用小写写:

print(x.strftime('%y'))

输出:

18 

这次省略了年份中前两位数字。如你所见,使用这些格式化代码,你可以用想要的任何方式表示日期时间。

使用 strptime 将字符串转换成日期

strftime 方法帮助我们将日期对象转换为可读的字符串,strptime 恰恰相反。它作用于字符串,并将它们转换成 Python 可以理解的日期对象。

这是这个方法的语法:

datetime.strptime(string, format)

string 参数是我们转换成日期格式的字符串值。format 参数是指定转换后日期采用的格式的指令。

例如,如果我们需要将字符串 9/15/18 转换成 datetime 对象。

我们先导入 datetime 模块,我们将使用 from 关键字以便能够在没有点格式的情况下引用模块中特定的函数:

from datetime import datetime

然后我们可以用字符串形式定义日期(避免使用 str 作为变量名,以免覆盖内置类型):

date_str = '9/15/18'

在将字符串转换为实际的 datetime 对象之前,Python 无法将上述字符串理解为日期时间。我们可以通过调用 strptime 方法成功完成。

执行以下命令转换字符串:

date_object = datetime.strptime(date_str, '%m/%d/%y')

现在让我们调用 print 函数用 datetime 格式显示字符串:

print(date_object)

输出:

2018-09-15 00:00:00

如你所见,转换成功!

你可以看到正斜杠 / 用于分隔字符串的各个元素。这告诉 strptime 方法我们的日期是什么格式,我们的例子中是用 / 作为分隔符。

但是,如果月/日/年被 - 分隔怎么办?你应该这么处理:

from datetime import datetime

date_str = '9-15-18'
date_object = datetime.strptime(date_str, '%m-%d-%y')

print(date_object)

输出:

2018-09-15 00:00:00

再一次,多亏了格式说明符,strptime 方法能够解析我们的日期并将其转换为日期对象。

结论

在本文中,我们研究了如何在 Python 中格式化日期。我们看到 Python 中的 datetime 模块如何操作日期和时间值。该模块包含了许多操作日期时间的类,比如,time 类用于表示时间值,而 date 类用来表示日历日期值。

学习愉快!

相关阅读

  1. Python 基础教程
  2. 在 SublimeEditor 中配置 Python 环境
  3. Python 代码中添加注释
  4. Python 中的变量的使用
  5. Python 中的数据类型
  6. Python 中的关键字
  7. Python 字符串操作
  8. Python 中的 list 操作
  9. Python 中的 Tuple 操作
  10. Python max()和 min()–在列表或数组中查找最大值和最小值
  11. Python 找到最大的 N 个(前 N 个)或最小的 N 个项目
  12. Python 读写 CSV 文件
  13. Python 中使用 httplib2–HTTP GET 和 POST 示例
  14. Python 将 tuple 开箱为变量或参数
  15. Python 开箱 Tuple–太多值无法解压
  16. Python multidict 示例–将单个键映射到字典中的多个值
  17. Python OrderedDict–有序字典
  18. Python 字典交集–比较两个字典
  19. Python 优先级队列示例
说明:本文代码基于 Python 3 编写,适用于主流 Python 3.x 版本。datetime 模块为标准库,无需额外安装。