在 Python 中,datetme 模块定义了用于处理日期和时间的类。在本文中,我们将解释如何在 Python 中操作日期和时间。
目录
18-1 创建具有日期和时间信息的实例
18-2 实例化一个时区
18-3 使用当前日期和时间值创建一个实例
18-4 获取日期(年/月/日)和时间(时/分/秒)值
18-5 从表示日期或时间的字符串创建实例
18-6 使用指定格式获取日期或时间值作为字符串
18-7 生成一些日期和时间值替换为其他值的实例
18-8 日期和时间值的加法/减法和比较
datetiem 模块定义了几个用于处理日期和时间的类。datetime类有日期和时间的值,date类有日期的值,time类有时间的值,timezone类有时区的值。在这里,我们将解释如何指定与日期和时间相关的值并生成每个类的实例。
datetime CLASS
datetime CLASS是处理日期和时间值的类。构造函数如下所示:
class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
参数的含义和可以指定的取值范围如下。
year : 年 1 <= year <= 9999
month : 月 1 <= month <= 12
day : 日 1 <= day <= 给定月份和年份中的天数
hour : 小时 0 <= hour < 24
minute : 分钟 0 <= minute < 60
second : 秒 0 <= minute < 60
microsecon : 微秒 0 <= microsecond < 1000000
tzinfo : 时区
fold : 如果考虑夏令时则为 1,否则为 0
仅当时区被指定为参数时,实例才具有时区信息。(有时区信息的称为aware对象,没有时区信息的称为naive 对象。)
具体写如下。datetime CLASS是 datetime 模块的一部分。
import datetime
dt1 = datetime.datetime(2023, 8, 22)
print(dt1)
>> 2023-08-22 00:00:00
dt2 = datetime.datetime(2023, 8, 22, 9, 12, 30, 551)
print(dt2)
>> 2023-08-22 09:12:30.000551
beijing_tz = datetime.timezone(datetime.timedelta(hours=8))
dt3 = datetime.datetime(2023, 8, 22, 9, 12, 30, 551, beijing_tz)
print(dt3)
>> 2023-08-22 09:12:30.000551+08:00
在这种情况下,第一个和第二个实例是naive 的对象,第三个是有aware 的对象。
date CLASS
日期类是处理日期值的类。构造函数如下所示:
class datetime.date(year, month, day)
参数的含义和可以指定的取值范围如下。
year : 年 1 <= year <= 9999
month : 月 1 <= month <= 12
day : 日 1 <= day <= 给定月份和年份中的天数
具体写如下。date CLASS是datetime 模块的一部分。
import datetime
d = datetime.date(2023, 8, 22)
print(d)
>> 2023-08-22
date CLASS没有关于时区的信息。
time CLASS
时间类是处理时间值的类。构造函数如下所示:
class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
参数的含义和可以指定的取值范围如下。
hour : 時 0 <= hour < 24
minute : 分 0 <= minute < 60
second : 秒 0 <= minute < 60
microsecon : 微妙 0 <= microsecond < 1000000
tzinfo : 时区
fold : 夏令时为1, 否则 0
仅当时区被指定为参数时,实例才具有时区信息。
具体写如下。time CLASS是日期datetime模块的一部分。
import datetime
t1 = datetime.time(8, 12, 45, 561)
print(t1)
>> 08:12:45.000561
beijing_tz = datetime.timezone(datetime.timedelta(hours=9))
t2 = datetime.time(8, 12, 45, 561, beijing_tz)
print(t2)
>> 08:12:45.000561+08:00
在这种情况下,第一个实例是naive 的对象,第二个是aware对象。
示例代码
请看下面的示例。
import datetime
print(datetime.datetime(2023, 8, 22, 7, 13, 45, 561))
>> 2023-08-22 07:13:45.000561
print(datetime.date(2023, 8, 22))
>> 2023-08-22
print(datetime.time(7, 13, 45, 31112))
>> 07:13:45.031112
beijing_tz = datetime.timezone(datetime.timedelta(hours=8))
print(datetime.datetime(2023, 8, 22, 7, 13, 45, 561, beijing_tz))
>> 2023-08-22 07:13:45.000561+08:00
ny_tz = datetime.timezone(datetime.timedelta(hours=-4))
print(datetime.datetime(2023, 8, 22, 7, 13, 45, 561, ny_tz))
>> 2023-08-22 07:13:45.000561-04:00
我们讲解了datetime CLASS、date CLASS和time CLASS的实例,并输出与日期时间相关的值。
datetiem 模块中的时区类是 tzinfo 类的子类,包含与时区相关的值。在这里,我们将说明如何通过指定与 UTC(协调世界时)的时差来创建时区类的实例。
timezone CLASS
timezone CLASS是处理时区值的CLASS。构造函数如下所示:
class datetime.timezone(offset, name=None)
对于 offset 参数,指定 timedelta CLASS的实例,它是表示时差的对象。
timedeltaCLASS是处理时差值的CLASS。构造函数如下所示:
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
参数是天、秒、微秒、毫秒、分钟、小时和周来表示时差。。
对于时区,指定与 UTC 的时差。指定 hours=8 以获取北京时区或 hours=-5 以获取纽约(美国)时区。具体写如下。timezone 和 timedelta 类是 datetime 模块的一部分
import datetime
beijing_tz = datetime.timezone(datetime.timedelta(hours=8))
print(beijing_tz)
>> UTC+09:00
ny_tz = datetime.timezone(datetime.timedelta(hours=-4))
print(ny_tz)
>> UTC-04:00
要获取 UTC 时区,可以将时差指定为 0,但也可以使用 timezone.utc,它是 timezone 类的一个属性值。
import datetime
utc_tz1 = datetime.timezone(datetime.timedelta(0))
print(utc_tz1)
>> UTC
ny_tz2 = datetime.timezone.utc
print(utc_tz1)
>> UTC
示例代码
请看下面的示例。
import datetime
print(datetime.timezone(datetime.timedelta(hours=9)))
>> UTC+09:00
print(datetime.timezone(datetime.timedelta(hours=-4)))
>> UTC-04:00
print(datetime.timezone.utc)
>> UTC
这样我们就能够通过指定与 UTC 的时差来创建表示时区。
通过使用datetime CLASS和date CLASS提供的 now 方法,我们可以创建和使用具有当前日期和时间值的实例。这里我们描述如何创建一个具有当前日期和时间值的实例。
获取当前日期和时间值
使用 datetime CLASS的 now 方法创建具有当前日期和时间值的 datetime CLASS的实例。
datetime.now(tz=None)
如果省略参数,则创建一个具有当前本地日期和时间的实例,如果将timezone CLASS的实例指定为参数,则创建一个具有时区信息的实例。
具体写如下。datetime CLASS是 datetime 模块的一部分。
import datetime
dt1 = datetime.datetime.now()
print(dt1)
>> 2022-08-22 06:54:09.960156
tz_beijing = datetime.timezone(datetime.timedelta(hours=8))
dt2 = datetime.datetime.now(tz_beijing)
print(dt2)
>> 2022-08-22 06534:09.977525+08:00
datetime CLASS的 today 方法 CLASS都能够创建了一个具有当前本地日期和时间的实例。但是我们不能在 today 方法的参数中指定时区。
datetime.today()
具体写如下。
import datetime
dt = datetime.datetime.today()
print(dt)
>> 2022-08-23 09:39:17.438566
获取当前日期值
要使用当前日期值创建日期类的实例,请使用date CLASS的 today 方法。(由于date CLASS是一个naive的对象,因此没有创建带有时区信息的实例的方法)。
date.today()
具体写如下。
import datetime
dt = datetime.date.today()
print(dt)
>> 2028-08-23
示例代码
请参阅以下示例。
import datetime
print(datetime.date.today())
>> 2023-08-23
print(datetime.datetime.now())
>> 2023-08-23 21:30:36.591296
beijing_tz = datetime.timezone(datetime.timedelta(hours=8))
print(datetime.datetime.now(beijing_tz))
>> 2023-08-23 21:30:40.791296+08:00
ny_tz = datetime.timezone(datetime.timedelta(hours=-4))
print(datetime.datetime.now(ny_tz))
>> 2023-08-23 09:30:40.248577-04:00
这就是我们使用 datetime CLASS和 date CLASS的 now 和 today 方法来创建具有当前日期和时间值的实例。
本节介绍如何从datetime CLASS和date CLASS的实例中提取和获取年月等日期时间值和分秒等时间值。
引用属性值
具有日期和时间值的 datetime CLASS具有以下每个实例可用的属性:
datetime.year : 年
datetime.month : 月
datetime.day : 日
datetime.hour : 時
datetime.minute : 分
datetime.second : 秒
datetime.microsecond : 微秒
datetime.tzinfo : 时区
datetime.fold : 0 or 1
具体写如下。
import datetime
dt = datetime.datetime.now()
print(dt)
>> 2022-08-23 12:08:25.512439
print(dt.year)
>> 2022
print(dt.minute)
>> 8
属性值可以在data CLASS和time CLASS类中引用,也可以在datatime CLASS中引用。
具有日期值的date CLASS每个实例可以引用以下属性。
date.year : 年
date.month : 月
date.day : 日
time.hour : 時 time.minute : 分 time.second : 秒 time.microsecond : 微秒 time.tzinfo : 时区 time.fold : 0 or 1
示例代码
请看下面的示例。
import datetime
beijing_tz = datetime.timezone(datetime.timedelta(hours=8))
dt = datetime.datetime.now(beijing_tz)
print(dt)
>> 2022-08-23 21:36:18.456917+08:00
print("year : " + str(dt.year))
>> year : 2022
print("month : " + str(dt.month))
>> month : 8
print("day : " + str(dt.day))
>> day : 23
print("hour : " + str(dt.hour))
>> hour : 21
print("minute : " + str(dt.minute))
>> minute : 36
print("second : " + str(dt.second))
>> second : 18
print("microsecond : " + str(dt.microsecond))
>> microsecond : 456917
print("tzinfo : " + str(dt.tzinfo))
>> tzinfo : UTC+08:00
这样我们就可以datetime类实例中引用并输出月、秒等属性值。
datetime CLASS的 strptime 方法可用于解析表示日期或时间的字符串,提取日期或时间值,并基于该值创建 datetime CLASS的实例。在这里,我们将解释如何从表示日期和时间的字符串创建实例。
解析一个字符串并创建一个实例
例如,您可以从表示日期和时间的字符串(例如“2022/08/23 10:4:38”)创建 datetime CLASS的实例。使用 datetime 类的 strptime 方法。
datetime.strptime(date_string, format)
在第一个参数中指定一个表示日期或时间的字符串,在第二个参数中指定一个定义用于解析的格式的字符串。
通过组合以下格式代码来定义格式字符串(仅显示部分格式代码)。例如,“2020/07/22 10:4:38”变为“%Y/%m/%d %H:%M:%S”。
%y : 两位数年份 00, 01, ..., 99
%Y : 4 位数月份 0001, 0002, ..., 9999
%b : 缩写月份名称 Jan, Feb, ..., Dec
%B : 月份名称 January, February, ..., December
%m : 01、02、...、12 月
%d : 第 01、02、...、31 天
%H : 小时 (24 小时) 00, 01, ..., 23
%I : 小时 (12 小时) 00, 01, ..., 11
%p : AM or PM
%M : 分 00, 01, ..., 59
%S : 秒 00, 01, ..., 59
%f : 微秒 000000, 000001, ..., 999999
%z : 时区(空字符串), +0000, -0400 etc
%Z : 时区名称(空字符串), UTC, EST
具体写如下。
import datetime
dt = datetime.datetime.strptime("2022/08/23 12:9:39", "%Y/%m/%d %H:%M:%S")
print(dt)
>> 2022/08/23 12:9:39
なお解析に失敗した場合は ValueError となります。
import datetime
dt = datetime.datetime.strptime("2022/15/22 12:9:39", "%Y/%m/%d %H:%M:%S")
>> ValueError: time data '2022/15/22 12:9:39' does not match format '%Y/%m/%d %H:%M:%S'
示例代码
请看下面的示例。
import datetime
str1 = "2022/08/22 13:37:4:33217"
str2 = "08/22/2022 PM 1:37:4:33217"
str3 = "August 22,2022 13:37:4:33217+08:00"
dt1 = datetime.datetime.strptime(str1, "%Y/%m/%d %H:%M:%S:%f")
dt2 = datetime.datetime.strptime(str2, "%m/%d/%Y %p %I:%M:%S:%f")
dt3 = datetime.datetime.strptime(str3, "%B %d,%Y %H:%M:%S:%f%z")
print(dt1)
>> 2022-08-22 13:37:04.332170
print(dt2)
>> 2022-08-22 13:37:04.332170
print(dt3)
>> 2022-08-22 13:37:04.332170+08:00
这样我们解析了表示以三种不同格式编写的日期和时间的字符串,并为每种格式创建了 datetime CLASS的实例。
我们可以使用 datetime CLASS的 strftime 方法获取 datetime CLASS实例的日期和时间值作为使用指定格式的字符串。本节介绍如何使用指定格式获取日期和时间值作为字符串。
以指定格式的字符串形式获取日期或时间值
例如,我们可以指定格式并获取 datetime CLASS实例的日期和时间值作为字符串,如“2022/08/23 10:4:38”。使用 datetime CLASS的 strftime 方法。
datetime.strftime(format)
指定将字符串转换为参数时要使用的格式。
通过组合以下格式代码来定义格式字符串(仅显示部分格式代码)。
%y : 2位数年份 00, 01, ..., 99
%Y : 4位数月份 0001, 0002, ..., 9999
%b : 缩写月份名称 Jan, Feb, ..., Dec *1
%B : 月份 January, February, ..., December ※1
%m : 01、02、...、12 月
%d : 第 01、02、...、31 天
%H : 時(24小时) 00, 01, ..., 23
%I : 時(12小时) 00, 01, ..., 11
%p : AM or PM ※1
%M : 分 00, 01, ..., 59
%S : 秒 00, 01, ..., 59
%f : 微秒 000000, 000001, ..., 999999
%z : 时区(空字符串), +0000, -0400 etc
%Z : 时区名称(空字符串), UTC, EST
%a : 星期几的缩写 Sun, Mon, ..., Sat ※1
%A : 星期 Sunday, Monday, ..., Saturday ※1
%c : 正确显示日期和时间 ※1
%x : 正确显示日期 ※1
%X : 正确显示时间 ※1
※1 该值因设置的语言环境而异
具体写如下。
import datetime
beijing_tz = datetime.timezone(datetime.timedelta(hours=8))
dt = datetime.datetime.now(beijing_tz)
print(dt.strftime("%Y/%m/%d %a %H:%M:%S"))
>> 2022/08/23 Wed 20:51:07
print(dt.strftime("%B %d,%Y %p %I:%M:%S:%f%z"))
>> August 23,2022 PM 08:51:07:737135+0800
请注意,date CLASS和time CLASS中也提供了 strftime 方法。
示例代码
请看下面的示例。
import datetime
beijing_tz = datetime.timezone(datetime.timedelta(hours=8))
dt = datetime.datetime.now(beijing_tz)
print(dt.strftime("%y/%m/%d %A %H:%M:%S"))
>> 22/11/13 Friday 22:25:55
print(dt.strftime("%B %d,%Y %p %I:%M:%S%z"))
>> November 13,2022 PM 10:25:55+0800
print(dt.strftime("%c"))
>> Fri Nov 13 22:25:55 2022
这样我么就可以为datetime CLASS的实例指定了 3 种模式的格式,并将其作为字符串获取。
设置语言环境
前面列出的带有 *1 的格式代码具有不同的值,具体取决于设置的语言环境。例如,如果您希望星期几是字符串“星期一”而不是“Monday”,请将语言环境设置为简体汉语。
具体来说,在程序的开头写下如下内容。
import locale
locale.setlocale(locale.LC_ALL, 'zh_CN.UTF-8')
これでロケールの設定は完了です。それではロケールの設定も含め具体的には次のように記述します。
import datetime
import locale
locale.setlocale(locale.LC_ALL, 'zh_CN.UTF-8')
beijing_tz = datetime.timezone(datetime.timedelta(hours=8))
dt = datetime.datetime.now(beijing_tz)
print(dt.strftime("%Y/%m/%d %a %H:%M:%S"))
>> 2022/08/24 周三 21:13:26
print(dt.strftime("%B %d,%Y %p %I:%M:%S:%f%z"))
>> 2022-08-24 下午 09:13:26:499226+0900
通过设置语言环境,星期几和 AM/PM 现在可以用汉语显示。
示例代码
请看下面的示例。
import datetime
import locale
locale.setlocale(locale.LC_ALL, 'zh_CN.UTF-8')
beijing_tz = datetime.timezone(datetime.timedelta(hours=8))
dt = datetime.datetime.now(beijing_tz)
print(dt.strftime("%y/%m/%d %A %H:%M:%S"))
>> 22/11/11 星期五 22:42:26
print(dt.strftime("%B %d,%Y %p %I:%M:%S%z"))
>> 11月 11,2022 下午 10:42:26+0900
print(dt.strftime("%c"))
>> 2022/11/11 22:42:26
设置语言环境后,我们可以为 datetime CLASS实例指定了 3 种格式模式,并将其作为字符串获取。
通过使用 datetime CLASS的 replace 方法,可以生成一个实例,其中日期和时间的某些值如月份和分钟被替换为其他值。您还可以创建一个新实例,将时区信息添加到不包含时区值的实例中。在这里,我们将解释如何生成一个将日期和时间的某些值替换为其他值的实例。
用另一个值替换日期或时间值
使用 datetime CLASS的 replace 方法通过将日期或时间值替换为另一个值来创建 datetime CLASS的新实例。(因为它很长,所以显示时每个参数都有一个换行符)。
datetime.replace(
year=self.year,
month=self.month,
day=self.day,
hour=self.hour,
minute=self.minute,
second=self.second,
microsecond=self.microsecond,
tzinfo=self.tzinfo,
* fold=0)
例如,要更改年份值,请将 year=2022指定为参数。未指定为参数的值保持原样。通过用其他值替换一些值来创建一个新的日期时间类实例。
具体写如下。
import datetime
beijing_tz = datetime.timezone(datetime.timedelta(hours=8))
dt = datetime.datetime.now(beijing_tz)
print(dt);
>> 2022-08-23 23:48:03.585628+08:00
new_dt = dt.replace(year=2022, hour=4, minute=0, second=0)
print(new_dt);
>> 2022-07-22 04:00:00.585628+08:00
日期和时间类中也提供了替换方法。
示例代码
请看下面的示例。
import datetime
beijing_tz = datetime.timezone(datetime.timedelta(hours=8))
dt = datetime.datetime.now()
print(dt);
>> 2020-11-13 22:57:45.063519
print(dt.replace(hour=4, minute=0, second=0))
>> 2020-11-13 04:00:00.063519
print(dt.replace(year=2018, month=4, day=1))
>> 2018-04-01 22:57:45.063519
print(dt.replace(tzinfo=beijing_tz))
>> 2020-11-13 22:57:45.063519+08:00
第三种是使用没有时区信息的 datetime 类的实例,并创建一个具有时区信息的新实例。
我们还可以通过从日期或时间值中添加或减去天数、分钟数等来创建新实例。您还可以找到并比较两个日期和时间值之间的差异。本节介绍如何操作和比较日期和时间值。
日期和时间的操作
可以通过将表示时间差的 timedelta CLASS的实例添加或减去 datetime CLASS或日期类的实例来创建新实例。图像看起来像这样:
dt2 = dt1 + td
dt2 = dt1 - td
medelta 类是处理时差值的类。构造函数如下所示:
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
参数是用天、秒、微秒、毫秒、分钟、小时和周来表示时差。
比如要加1天,这样写。
import datetime
dt1 = datetime.datetime(2020, 7, 21, 6, 12, 30, 551)
print(dt1)
>> 2020-07-21 06:12:30.000551
dt2 = dt1 + datetime.timedelta(days=1)
print(dt2)
>> 2020-07-22 06:12:30.000551
dt3 = dt1 + datetime.timedelta(days=-1)
print(dt3)
>> 2020-07-20 06:12:30.000551
与原始日期值相比,它是未来一天和过去一天。
示例代码
请看下面的示例。
import datetime
d1 = datetime.date(1999, 12, 1)
print(d1)
>> 1999-12-01
print(d1 + datetime.timedelta(days=31))
>> 2000-01-01
print(d1 + datetime.timedelta(days=-2))
>> 1999-11-29
这样我们就为日期类的每个实例创建了一个新实例,增加 31 天并减去 2 天。