为啥tableapi的结果时间比所给时间短8小时
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥tableapi的结果时间比所给时间短8小时相关的知识,希望对你有一定的参考价值。
参考技术A 1、容器的时区与实际时区相差差8小时2、jvm时区与实际时区相差8小时
3、存入数据库后的时间相差8小时
4、后端获取的时间一致,但返回给前端后相差8小时
如果我将 UTC 时间加 1 小时并进行本地化,或者将本地时间加 1 小时,为啥会有所不同?
【中文标题】如果我将 UTC 时间加 1 小时并进行本地化,或者将本地时间加 1 小时,为啥会有所不同?【英文标题】:Why does it make a difference if I add 1 hour to the UTC time and localize or 1 hour to the local time?如果我将 UTC 时间加 1 小时并进行本地化,或者将本地时间加 1 小时,为什么会有所不同? 【发布时间】:2018-10-30 18:59:27 【问题描述】:示例代码
from datetime import datetime, timezone, timedelta
import pytz
t11 = datetime(1918, 4, 15, 0, 0, tzinfo=timezone.utc).astimezone(pytz.timezone('Europe/Berlin'))
t12 = t11 + timedelta(hours=1)
t2 = datetime(1918, 4, 15, 1, 0, tzinfo=timezone.utc).astimezone(pytz.timezone('Europe/Berlin'))
print(t12)
print(t2)
观察到
1918-04-15 02:00:00+01:00
1918-04-15 03:00:00+02:00
预期
我希望两者都是我看到的t2
。关键的区别是t2.hour
与t12.hour
。对于时区感知的日期时间对象,我希望小时是本地时间。
问题
如何改变这种行为?这是什么原因造成的?
【问题讨论】:
再一次,这不是关于图书馆,而是关于德国时间;那是时钟改变的时候:timeanddate.com/time/change/germany?year=1918。如果您没有在冬季/夏季时间之间移动,您会看到不同的行为。 当然。这正是我选择这次的原因。 那你为什么不在问题中提及呢?为什么是 1918 年;今年的变化不会发生吗?你读过例如***.com/a/46185504/3001761? @jonrsharpe 我想很明显我没有意外选择 DST 开始的时间。(1918 年,因为我正在试验时区的旧变化。最初,我想看看 pytz知道相当古老的变化。见Wikipedia article。 【参考方案1】:我不会接受以下内容,因为它只解释了如何正确地做。它没有解释为什么添加 timedelta 一开始就不能按预期方式工作。
如何解决
This answer建议采取以下方法:
from datetime import datetime, timezone, timedelta
import pytz
# Timezone-aware object to start with
t11 = datetime(1918, 4, 15, 0, 0, tzinfo=timezone.utc).astimezone(pytz.timezone('Europe/Berlin'))
# Extract timezone information
tzinfo = t11.tzinfo
# Convert to UTC, add timedelta, convert to local timezone
t13 = (t11.astimezone(pytz.timezone('utc')) + timedelta(hours=1)).astimezone(tzinfo)
另一种方法:
t14 = t11 + timedelta(hours=1) # Invalid timezone!
t14 = t14.astimezone(pytz.utc).astimezone(t14.tzinfo) # Fix the timezone
现在我有:
t11: 1918-04-15 01:00:00+01:00
t13: 1918-04-15 03:00:00+02:00 # one hour more and +1h because of DST
钟摆
包pendulum
是另一种修复它的方法:
from pendulum import datetime
from datetime import timedelta
import pytz
t11 = datetime(1918, 4, 15, 0, 0).astimezone(pytz.timezone('Europe/Berlin'))
t12 = t11 + timedelta(hours=1)
t2 = datetime(1918, 4, 15, 1, 0).astimezone(pytz.timezone('Europe/Berlin'))
给予:
t11: 1918-04-15T01:00:00+01:00
t12: 1918-04-15T03:00:00+02:00
t2 : 1918-04-15T03:00:00+02:00
【讨论】:
以上是关于为啥tableapi的结果时间比所给时间短8小时的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在php中用date()函数获取的时间老师与我电脑上显示的差8小时?
为啥我在php中用date()函数获取的时间老师与我电脑上显示的差8小时?