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

问题描述 投票:3回答:2

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

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

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

如何解决我的问题?

python python-3.x datetime timedelta
2个回答
0
投票
因此,在日期时间,时区和偏移量这可怕的世界中,似乎所有事物都是这些奇怪而美好的事物之一。该问题似乎源于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> }

似乎当您将时区传递给now方法时,它会根据您设置中的某些本地TZINFO从3个选择中选择时区。但是,当通过时区进行替换时,只是选择了相差300的LMT。关于LMT的快速说明:

今天本地平均时间:虽然本地平均时间不直接确定这些天的民事时间,它仍然用于确保我们时钟尽可能接近太阳。 UT1,是世界时间是墨西哥本初子午线的当地平均时间伦敦格林威治。它是用于计算的组件之一协调世界时(UTC),用于确定世界各地的本地时间。

LMT也被世界各地的天文学家用来计时观察结果。

基本上,您的问题涉及datetime.now()和当地时间(LMT)时区。因此,正如我在帖子中提到的那样,请始终创建一个您的日期,或者通过替换创建两个日期(尽管按照实际时间您仍会偏离5分钟,但差异是正确的。)

UPDATE

如果两个datetime.replace()对象都位于悉尼当地时间,则可以像使用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())

0
投票
简单地说:不要2020-05-18 18:51:24.722614+10:00 2020-05-18 18:52:30+10:00 65.277386 (-因为此函数可以给出replace(),所以sort-of random results

localize()

© www.soinside.com 2019 - 2024. All rights reserved.