提问人:vladandreevza5557 提问时间:10/3/2023 更新时间:10/5/2023 访问量:57
如何编写用于将日期时间字符串与时区偏移量进行比较的断言
How to Write Assertions for Comparing Datetime Strings with Timezone Offset
问:
我正在开发一个 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
但是,断言未按预期工作。我想编写断言来比较这些日期时间字符串并考虑时区偏移量。我怎样才能做到这一点?
答:
0赞
blhsing
10/3/2023
#1
据推测,您有一个朴素的日期/时间字符串(一个没有时区偏移量/名称的字符串),因为生成它的脚本假定该时区是本地的。若要使其与另一个包含时区信息的日期/时间字符串进行比较,还需要将其转换为包含时区信息的字符串。该对象方便地提供了一个 astimezone
方法,该方法可以在没有参数的情况下调用时通过向对象添加本地时区来识别对象,因此,一旦有两个感知对象,就可以进行有效的比较:datetime.datetime
datetime
datetime
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 步是您需要知道它应该在哪个时区。一旦你知道了这一点,你只需要将该信息添加到解析的对象中。完全没有必要手动调整偏移量和自己。datetime
timedelta
我假设你幼稚的时间戳应该是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
评论