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
如何解决我的问题?
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())
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()