我想使用数据库结果中的时间戳并将其转换为我的语言环境时间格式。时间戳本身以UTC格式保存:2015-03-30 07:19:06.746037+02
。在使用格式print value.strftime(format)
调用%d.%m.%Y %H:%M %z
后,输出将为30.03.2015 07:19 +0200
。这可能是显示带有时区信息的时间戳的正确方法,但不幸的是,这里的用户并不习惯这样。我想要实现的是给定时间戳的以下内容:30.03.2015 09:19
。现在我通过
is_dst = time.daylight and time.localtime().tm_isdst > 0
utc_offset = - (tine.altzone if is_dst else time.timezone)
value = value + timedelta(seconds=utc_offset)
我想知道我的问题是否有更智能的解决方案。 (timestamp.tzinfo
有offset
值,可以/应该使用吗?解决方案也需要知道DST。)
答案 0 :(得分:0)
在你的问题中,时间戳已经在所需的时区,所以你不需要做任何事情。
如果您想将其转换为其他时区,您应该可以使用;
YourModel.datetime_column.op('AT TIME ZONE')('your timezone name')
,或者
func.timezone('your timezone name', YourModel.datetime_column)
在SQLAlchemy级别。
在python级别,请考虑使用pytz
答案 1 :(得分:0)
使用时区感知数据库时间戳时,不需要手动进行转换,除非您要显示的时区与系统时区不同。 当您将datetime对象读取和写入数据库时,会考虑datetime对象的时区信息,这意味着您获取的是本地时区的时间,在您的情况下为+0200。
答案 2 :(得分:0)
This SO post answers how to get local time from a timezoned timestamp.
基本上,使用tzlocal。
import time
from datetime import datetime
import pytz # $ pip install pytz
from tzlocal import get_localzone # $ pip install tzlocal
# get local timezone
local_tz = get_localzone()
# test it
# utc_now, now = datetime.utcnow(), datetime.now()
ts = time.time()
utc_now, now = datetime.utcfromtimestamp(ts), datetime.fromtimestamp(ts)
local_now = utc_now.replace(tzinfo=pytz.utc).astimezone(local_tz) # utc -> local
assert local_now.replace(tzinfo=None) == now