查找给定时区的无意识日期时间的夏令时状态。

18 浏览
0 Comments

查找给定时区的无意识日期时间的夏令时状态。

我有一个没有时区信息的datetime对象。现在我获取了时区信息,并想将时区信息添加到现有的datetime对象中,我应该如何操作?\n

d = datetime.datetime.now()
tz = pytz.timezone('Asia/Taipei')

\n如何将时区信息tz添加到ddatetime对象中?

0
0 Comments

在处理时区问题时,有时候需要找到一个不带时区信息的日期时间对象的夏令时状态。下面是一个关于如何解决这个的问题。如果你知道原始日期时间对象是在你想要添加的时区中"测量"的,你可以使用replace方法而不是localize方法。但是这种方法可能不太推荐。以下是使用replace方法的示例代码:

d = d.replace(tzinfo=tz)

这种方法可能有两种情况可以使用:

1. 当服务器的区域设置设置为错误的时区,并且你正在尝试通过使日期时间对象意识到这个错误的时区(然后可能将其本地化为“正确”的时区,以便将now()的值与其他要比较的时间(比如你的手表)相匹配)。

2. 当你想要给一个时间对象(不是日期时间对象)“标记”一个时区(tzinfo)属性,以便稍后可以使用该属性形成一个完整的日期时间对象。

另外还有两种情况可能会遇到这个问题:

3. 从数据库中检索到一个带有时区信息的日期时间对象,但是你知道它存储的时区,并且你想在检索后对其进行操作。

4. 使用utcnow生成了一个不带时区信息的utc时间,而你需要与一个带时区信息的时间进行比较。

但是需要注意的是,上面的解决方法可能会遇到问题。例如,下面是一个快速示例:

parse('2022-09-03 10:00').replace(tzinfo=pytz.timezone('Europe/Berlin')) - parse('2022-09-03 10:00:00+02:00')  # datetime.timedelta(seconds=4020)
pytz.timezone('Europe/Berlin').localize(parse('2022-09-03 10:00')) - parse('2022-09-03 10:00:00+02:00')  # datetime.timedelta(0)

以上就是关于如何找到一个不带时区信息的日期时间对象的夏令时状态的讨论。

0
0 Comments

在上述内容中,我们可以看到提到了如何通过pytz库的localize()方法将一个naive datetime对象本地化。localize()方法用于本地化一个没有时区信息的naive datetime对象。如果不使用tz.localize(),而是使用datetime.replace(),那么可能会使用一个历史偏移量;而tz.localize()会选择给定日期生效的正确偏移量。例如,美国东部时区的夏令时开始和结束日期随时间变化。

当你尝试本地化一个由于夏令时开始和结束时间之间的过渡期而不确定的datetime值时,时区会被查询以确定生成的datetime对象是否应该返回True或False的.dst()。你可以通过.localize()的is_dst关键字参数来覆盖时区的默认设置:

dt = tz.localize(naive, is_dst=True)

你甚至可以通过设置is_dst=None来关闭选择。在这种情况下,或者在时区没有设置默认值的罕见情况下,一个不确定的datetime值会导致引发AmbiguousTimeError异常。is_dst标志只用于不确定的datetime值,否则会被忽略。

要将具有时区信息的时区感知对象转换回naive对象,可以使用.replace(tzinfo=None):

naivedt = awaredt.replace(tzinfo=None)

要从具有tzinfo的datetime获取naive datetime,可以在datetime对象上调用.replace(tzinfo=None)。返回值是一个naive datetime实例。

is_dst参数用于解决模糊时间或断言在该时间没有DST转换的情况。

.localize(dt)方法可能会产生一个不存在的时间(在“向前跳跃”夏令时转换期间)。要修复这个问题,可以调用tz.normalize(local_dt)。或者使用is_dst=None来防止tz.localize()返回模糊或不存在的时间。

对于除了GMT/UTC之外的时区,pytz.timezone.localize(datetime.time, pyzt)将失败(pytz.timezone.tzinfo.timedelta不为零)。localize方法适用于datetime,但不适用于time(因为它可能必须跨越到新的一天)。对于time,只需使用new_time = old_time.replace(tzinfo=pytz.timezone(timezone_name)。这不会调整时间以适应新的时区,而是假定它已经以当地时间“测量”了。另外,如果你不想“移动”一个datetime,.replace也适用于datetimes。

根据上述内容,我们可以总结出以下问题的原因和解决方法:

问题:给定时区,查找一个naive datetime的夏令时状态。

原因:在处理夏令时开始和结束日期之间的过渡期时,时区会被查询以确定生成的datetime对象是否应该返回True或False的.dst()。

解决方法:使用tz.localize()方法本地化naive datetime对象,并通过is_dst关键字参数覆盖时区的默认设置。

另外,可以使用.replace(tzinfo=None)方法将具有时区信息的时区感知对象转换回naive对象。

0