如何编写用于将日期时间字符串与时区偏移量进行比较的断言

How to Write Assertions for Comparing Datetime Strings with Timezone Offset

提问人:vladandreevza5557 提问时间:10/3/2023 更新时间:10/5/2023 访问量:57

问:

我正在开发一个 Python 脚本,该脚本与服务器交互并检索日期时间字符串。我面临的挑战是将脚本中的日期时间字符串与从服务器接收的日期时间字符串进行比较。服务器字符串包含时区偏移量,这使得直接字符串比较成为问题。

下面是该问题的示例:

  • 我的字符串输出:2023-10-03T01:52:04
  • 服务器字符串输出:2023-10-02T21:52:04-04:00

我试图使用以下代码解决此问题:

from datetime import datetime, timedelta
from dateutil.parser import parse

# My string output
my_string_output = "2023-10-03T01:52:04"
# Server string output
server_string_output = "2023-10-02T21:52:04-04:00"

# Extract the time zone offset from the server string output
offset = server_string_output[-6:]

# Parse the time strings with time zone offset
my_string_dt = parse(my_string_output)
server_string_dt = parse(server_string_output)

# Adjust for the time zone offset
if offset[0] == '-':
    server_string_dt -= timedelta(minutes=int(offset[1:]) * 60)
else:
    server_string_dt += timedelta(minutes=int(offset[1:]) * 60)

# Now, compare the adjusted date and time
assert server_string_dt == my_string_dt

但是,断言未按预期工作。我想编写断言来比较这些日期时间字符串并考虑时区偏移量。我怎样才能做到这一点?

python 字符串 datetime 时间 断言

评论

0赞 deceze 10/3/2023
如果字符串不包含时区/偏移量,那么它是偶数时间?如果不知道它应该在哪个时区,你根本无法有意义地比较它。如果您确实知道它在哪个时区,那么只需添加该信息即可;可能是通过在解析字符串后向朴素的 DateTime 对象添加一个时区。

答:

0赞 blhsing 10/3/2023 #1

据推测,您有一个朴素的日期/时间字符串(一个没有时区偏移量/名称的字符串),因为生成它的脚本假定该时区是本地的。若要使其与另一个包含时区信息的日期/时间字符串进行比较,还需要将其转换为包含时区信息的字符串。该对象方便地提供了一个 astimezone 方法,该方法可以在没有参数的情况下调用时通过向对象添加本地时区来识别对象,因此,一旦有两个感知对象,就可以进行有效的比较:datetime.datetimedatetimedatetime

assert datetime.fromisoformat(my_string_output).astimezone() == \
       datetime.fromisoformat(server_string_output)

评论

1赞 deceze 10/3/2023
日期时间实例无需转换为同一时区即可进行比较。只要您比较两个已知或两个幼稚的日期时间,就可以很好地比较它们,而无需任何转换。
0赞 blhsing 10/3/2023
@deceze 你说得对。谢谢。
0赞 deceze 10/3/2023
现在,您只是假设这是本地时间,这将在运行它的每台计算机上生成不同的时间戳。my_string_output
0赞 blhsing 10/3/2023
@deceze 从问题的措辞来看(“我正在开发一个 Python 脚本......比较我的脚本中的日期时间字符串“) 我认为可以公平地假设运行生成 的 的 OP 脚本的系统也是将运行解析该字符串进行比较的脚本的系统。也许OP可以在这里澄清一下。my_string_output
1赞 deceze 10/3/2023 #2

问题在于,其中一个时间戳是幼稚的(不包含时区信息),而另一个时间戳是知道的。这使得时间具有不可比性,因为朴素的时间戳可以代表几十个可能的不同时间点,具体取决于您在哪个时区解释它。第 1 步是您需要知道它应该在哪个时区。一旦你知道了这一点,你只需要将该信息添加到解析的对象中。完全没有必要手动调整偏移量和自己。datetimetimedelta

我假设你幼稚的时间戳应该是UTC:

>>> from datetime import datetime, timezone

>>> a = "2023-10-03T01:52:04"
>>> b = "2023-10-02T21:52:04-04:00"

>>> datetime.fromisoformat(a)
datetime.datetime(2023, 10, 3, 1, 52, 4)

>>> datetime.fromisoformat(b)
datetime.datetime(2023, 10, 2, 21, 52, 4, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000)))

>>> datetime.fromisoformat(a).replace(tzinfo=timezone.utc)
datetime.datetime(2023, 10, 3, 1, 52, 4, tzinfo=datetime.timezone.utc)

>>> datetime.fromisoformat(a).replace(tzinfo=timezone.utc) == datetime.fromisoformat(b)
True