当前位置: 首页 > 面试题库 >

如何在python中识别未知的日期时间时区

符允晨
2023-03-14
问题内容

我需要做什么

我有一个不了解时区的datetime对象,我需要向其添加一个时区,以便能够将其与其他时区感知的datetime对象进行比较。对于这一旧情况,我不想将我的整个应用程序转换为时区。

我尝试过的

首先,演示问题:

Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> import pytz
>>> unaware = datetime.datetime(2011,8,15,8,15,12,0)
>>> unaware
datetime.datetime(2011, 8, 15, 8, 15, 12)
>>> aware = datetime.datetime(2011,8,15,8,15,12,0,pytz.UTC)
>>> aware
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> aware == unaware
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes

首先,我尝试了astimezone:

>>> unaware.astimezone(pytz.UTC)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: astimezone() cannot be applied to a naive datetime
>>>

这次失败并不令人惊讶,因为它实际上是在尝试进行转换。替换似乎是一个更好的选择(根据Python:如何获取“时区感知”的datetime.today()值?):

>>> unaware.replace(tzinfo=pytz.UTC)
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> unaware == aware
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes
>>> 

但是正如您所看到的,replace似乎设置了tzinfo,但没有使对象知道。我准备回过头来解析输入字符串以在解析它之前有一个时区(如果需要的话,我正在使用dateutil进行解析),但这似乎令人难以置信。

另外,我在python 2.6和python 2.7中都尝试过,结果相同。

语境

我正在为某些数据文件编写解析器。我需要支持一种旧格式,其中日期字符串没有时区指示符。我已经修复了数据源,但是我仍然需要支持旧数据格式。由于各种业务BS原因,无法一次转换旧数据。通常,我不喜欢对默认时区进行硬编码的想法,在这种情况下,这似乎是最好的选择。我非常有把握地知道所有有问题的旧数据都位于UTC中,因此在这种情况下,我准备接受默认设置的风险。


问题答案:

通常,要使原始的datetime时区感知,请使用localize方法:

import datetime
import pytz

unaware = datetime.datetime(2011, 8, 15, 8, 15, 12, 0)
aware = datetime.datetime(2011, 8, 15, 8, 15, 12, 0, pytz.UTC)

now_aware = pytz.utc.localize(unaware)
assert aware == now_aware

对于UTC时区,localize由于没有夏令时计算可处理,因此实际上没有必要使用:

now_aware = unaware.replace(tzinfo=pytz.UTC)

作品。(.replace返回一个新的日期时间;它不会修改unaware。)



 类似资料:
  • 问题内容: 这是我正在尝试执行的一些代码片段: 我似乎无法比较日期和日期时间值。比较这些的最佳方法是什么?我应该将日期时间转换为日期还是相反?我如何在它们之间转换。 (一个小问题,但似乎有点令人困惑。) 问题答案: 使用该方法将日期时间转换为日期: 或者,您可以使用代替。你可以用 消除之后的时间部分。

  • 本文向大家介绍Java中的时间日期API知识点总结,包括了Java中的时间日期API知识点总结的使用技巧和注意事项,需要的朋友参考一下 自从 14 年发布 Java 8 以后,我们古老 java.util.Date 终于不再是我们 Java 里操作日期时间的唯一的选择。 其实 Java 里的日期时间的相关 API 一直为世猿诟病,不仅在于它设计分上工不明确,往往一个类既能处理日期又能处理时间,很混

  • 问题内容: 如何将时区感知日期时间对象转换为本地时区的等效非时区感知日期时间? 我的特定应用程序使用Django(尽管这实际上是一个通用的Python问题): .... 这导致Django抛出错误: 我需要的是: 什么会SOME_FUNCTION是什么? 问题答案: 通常,要将任意时区感知日期时间转换为原始(本地)日期时间,我将使用模块并将其转换为本地时间,并使日期时间变为原始状态: 但是由于你的

  • 问题内容: 我有一个系统(用Python开发),它接受 datetime作为各种格式的字符串 ,我必须 解析 它们。当前datetime字符串格式是: 现在我想要一个可以在适当的datetime对象中转换任何这些datetime格式的 通用解析器… 否则,我必须单独分析它们。因此,还请提供单独解析它们的方法(如果没有通用解析器)。 问题答案: 正如@TimPietzcker所建议的那样,dateu

  • 问题内容: 是否有一个内置的转换方法为在Python,例如获得在指定日期的午夜?相反的转换很容易:有一个方法。 我真的必须手动打电话吗? 问题答案: 您可以使用;现在,您创建一个初始化为午夜的对象。

  • 问题内容: DOB列样本值的格式- 默认情况下会转换为对象,如下所示 转换为日期格式 日期转换为 是 现在,我想将此日期格式转换为任何其他通用日期格式或。我该怎么做? 无论我尝试哪种方法,它总是以格式显示日期。 问题答案: 如果需要转换为其他格式,可以使用(但请注意,列的则为):