Python datetime.datetime.replace()方法

Python是一种动态的、著名的通用语言。它丰富了各种用例和支持库,并有大量来自其开发者的支持。

它提供了一个内置的datetime 模块,使处理日期、时间和时区的工作变得轻而易举。这个模块提供了一些方法和类,如date,datetime,tzinfo,timezone, 和timedelta ,以处理日期和时间。

这些类充斥着大量的功能和属性,并提供强大的功能。

一个日期,连同时间,被称为DateTime 。创建datetime 对象有时会很繁琐,因为它们接受许多值,如hour,day,minutes,timezone,seconds, 等等。

与其手动创建一个新的datetime 对象,我们可以使用一个现有的对象,根据我们的需要调整其值,然后生成一个新的datetime 对象。

每个datetime 对象都拥有一个replace() ,允许我们为其属性指定新的值,并使用这些值生成一个新的datetime 对象。在这篇文章中,我们将深入研究replace() 方法,并在一些相关例子的帮助下彻底理解它。

语法

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 整数 一个年份值。
month 整数 一个在1到12之间的月份值,包括在内。
day 整数 一个在1和31之间的日值,包括在内。
hour 整数 一个在0和23之间的小时值,包括在内。
minute 整数 一个在0和59之间的分钟值,包括在内。
second 整数 一个在0和59之间的秒值,包括在内。
microsecond 整数 一个在0和999999之间的微秒值,包括在内。
tzinfo 的一个子类datetime.tzinfo 一个具体的类,它是抽象的datetime.tzinfo 类的子类。
fold 整数 一个二进制字段,代表一个无效的日期。这里,1 表示一个无效的日期。

返回

replace() 方法返回一个新的datetime 对象,该对象的所有属性与原始对象相同,除了那些被提供了新值的属性。

请注意,如果tzinfo 被设置为None ,将返回一个无时区意识的datetime 对象,该对象没有进行日期和时间的转换。

默认情况下,对于天真的或无时区意识的对象,日期和时间是按照UTC或协调世界时来存储的。

例1:修改日期、时间和时区细节

import datetime
cet = datetime.timezone(datetime.timedelta(hours = 2), name = "CET")
ist = datetime.timezone(datetime.timedelta(hours = 5, minutes = 30), name = "India")
d = datetime.datetime(2022, 8, 25, 12, 33, 45, 234154)
print("Naive DateTime:", d)
d = d.astimezone(cet)
print("Timezone-aware DateTime:", d)
print("Changed Date:", d.replace(year = 2001, month = 5, day = 20))
print("Changed Time:", d.replace(hour = 10, minute = 11, second = 30, microsecond = 0))
print("Changed Timezone:", d.replace(tzinfo = ist))

输出:

Naive DateTime: 2022-08-25 12:33:45.234154
Timezone-aware DateTime: 2022-08-25 14:33:45.234154+02:00
Changed Date: 2001-05-20 14:33:45.234154+02:00
Changed Time: 2022-08-25 10:11:30+02:00
Changed Timezone: 2022-08-25 14:33:45.234154+05:30

上面的Python代码首先创建了一个datetime 对象。它还创建了两个时区对象,CET时区 (+02:00) 和 IST时区 (+05:30)。

然后使用astimezone() 方法将天真的datetime 转换为一个有时间区的对象。时区被设置为CET,日期和时间值被相应调整。

接下来,使用replace() 方法,日期、时间和时区被更新。请注意,当时区被更新为IST时区时,日期和时间值不会据此调整,这与astimezone() 方法不同;它们仍然与以前一样。

例2:将一个考虑到时区的datetime 转换为一个天真的实例

import datetime
cet = datetime.timezone(datetime.timedelta(hours = 2), name = "CET")
d = datetime.datetime(2022, 8, 25, 12, 33, 45, 234154)
print("Naive DateTime:", d)
d = d.astimezone(cet)
print("Timezone-aware DateTime:", d)
print("Changed Timezone:", d.replace(tzinfo = None))

输出:

Naive DateTime: 2022-08-25 12:33:45.234154
Timezone-aware DateTime: 2022-08-25 14:33:45.234154+02:00
Changed Timezone: 2022-08-25 14:33:45.234154

上面的 Python 代码首先创建了一个datetime 对象。这个对象是天真的(它不知道任何关于时区的信息;没有±HH:MM 的值)。

接下来,我们使用该对象的astimezone() 方法创建一个新的时区感知对象。这个方法接受一个抽象的datetime.tzinfo 类的子类的对象,并返回一个新的datetime 对象。

我们将时区设置为CET或欧洲中部时间。如果我们仔细观察输出结果,我们会发现时间已经改变了2 小时;从12:33:45.23415414:33:45.234154+02:00 ,它也有一个时区。

CET时区比UTC提前了2 小时。接下来,使用replace() 方法,我们将时区设置为None

请注意,现在datetime 对象再次变得天真,但输出告诉我们一个不同的故事。日期和时间值没有恢复到基于UTC的值;时区改变了(14:33:45.234154+02:0014:33:45.234154 )。