当减去从字符串转换的日期时间时,total_seconds() 是错误的

Jac*_*kie 5 python datetime timedelta python-3.x

当我这样做时,这total_seconds()是不正确的:

from datetime import timedelta, datetime
from pytz import timezone

timezone = timezone('Australia/Sydney')
startDate = datetime.now(timezone)
dateStr = '2020-05-18 20:12:30' # In our brain we know this time is in Sydney Time
endDate = datetime.strptime(dateStr, '%Y-%m-%d %H:%M:%S').replace(tzinfo=timezone)

diff = endDate - startDate
print(diff.total_seconds()) # incorrect answer
Run Code Online (Sandbox Code Playgroud)

当两个日期时间对象最初都是日期时间对象时,将它们相减,它们是正确的

from datetime import timedelta, datetime
from pytz import timezone

timezone = timezone('Australia/Sydney')
startDate = datetime.now(timezone)
endDate = datetime.now(timezone) + timedelta(hours=2, seconds=32)

diff = endDate - startDate
print(diff.total_seconds()) # correct answer
Run Code Online (Sandbox Code Playgroud)

我该如何解决我的问题?

Chr*_*yle 2

因此,日期时间、时区和偏移的可怕世界中的所有事物似乎都是这些奇怪而美妙的事物之一。该问题似乎源于以下事实:pytz.timezone将返回具有多个时区的时区对象。

{
(datetime.timedelta(seconds=36300), datetime.timedelta(0), 'LMT'): <DstTzInfo 'Australia/Sydney' LMT+10:05:00 STD>, 
(datetime.timedelta(seconds=36000), datetime.timedelta(0), 'AEST'): <DstTzInfo 'Australia/Sydney' AEST+10:00:00 STD>, 
(datetime.timedelta(seconds=39600), datetime.timedelta(seconds=3600), 'AEDT'): <DstTzInfo 'Australia/Sydney' AEDT+11:00:00 DST>
}
Run Code Online (Sandbox Code Playgroud)

看来当您将时区传递给 now 方法时,它会根据您设置中的一些本地 TZINFO 从您选择的 3 个时区中选择时区。然而,当通过时区进行替换时,它只是选择了相差300的LMT。简单提一下LMT:

今天的当地时间:虽然如今当地时间并不直接确定民用时间,但它仍然用于确保我们的时钟尽可能接近太阳。UT1 是世界时的一个版本,是伦敦格林威治本初子午线的当地时间。它是用于计算协调世界时 (UTC) 的组成部分之一,UTC 是用于确定全球当地时间的时间尺度。

世界各地的天文学家也使用 LMT 来计算观测时间。

本质上,您的问题涵盖了datetime.now()对本地时区的操作和datetime.replace()对 ​​LMT 时区的操作。因此,正如我在帖子中提到的,一致地创建日期,或者通过替换创建它们(尽管就实际时间而言,您仍然会落后 5 分钟,但差异是正确的。)

更新

如果您希望两个datetime对象都采用悉尼当地时间,那么您可以像使用之前一样创建星日期datetime.now()。但是您应该根据时区对象创建结束日期,要求它根据您的喜好进行本地化。

from datetime import datetime
from pytz import timezone

timezone = timezone('Australia/Sydney')
startDate = datetime.now(timezone)
dateStr = '2020-05-18 18:52:30' # In our brain we know this time is in Sydney Time
endDate = timezone.localize(datetime.strptime(dateStr, '%Y-%m-%d %H:%M:%S'))
print(startDate, endDate, sep="\n")
diff = endDate - startDate
print(diff.total_seconds())
Run Code Online (Sandbox Code Playgroud)

输出

2020-05-18 18:51:24.722614+10:00
2020-05-18 18:52:30+10:00
65.277386
Run Code Online (Sandbox Code Playgroud)