Python:strftime将UTC时间戳转换为本地时间格式

Python:strftime将UTC时间戳转换为本地时间格式,python,flask,internationalization,sqlalchemy,Python,Flask,Internationalization,Sqlalchemy,我想使用数据库结果中的时间戳,并将其转换为我的语言环境时间格式。时间戳本身以UTC格式保存:2015-03-30 07:19:06.746037+02。调用格式为%d.%m.%Y%H:%m%z的print value.strftimeformat后,输出将为2015年3月30日07:19+0200。这可能是用时区信息显示时间戳的正确方法,但不幸的是,这里的用户不习惯这样做。对于给定的时间戳,我希望实现以下目标:30.03.2015 09:19。现在我要加上两个小时 is_dst = time.d

我想使用数据库结果中的时间戳,并将其转换为我的语言环境时间格式。时间戳本身以UTC格式保存:2015-03-30 07:19:06.746037+02。调用格式为%d.%m.%Y%H:%m%z的print value.strftimeformat后,输出将为2015年3月30日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有一个偏移值,是否可以/应该改为使用该值?解决方案也需要知道DST。

在您的问题中,时间戳已经在所需的时区中,因此您无需执行任何操作

如果你想把它转换成其他时区,你应该能够使用

YourModel.datetime_column.op'AT TIME ZONEyour timezone name'

或者

func.timezone“您的时区名称”,YourModel.datetime\u列

在炼金术级别


在Python级别上,考虑使用

< P>当您使用时区感知的数据库时间戳时,不需要手动进行转换,除非要显示的时区与系统时区不同。 在将datetime对象读写到数据库时,会考虑datetime对象的时区信息,这意味着返回的是本地时区中的时间,在您的示例中为+0200

基本上,使用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

当您附加sqlalchemy标签时,我以为您只是在开玩笑,但我不知道它确实存在:它是python/flask领域中非常有名的ORM。如果您想在python级别上实现它,可以使用它。它是DST感知的。在SQL/SQLAlchemy级别中,您可以使用提取时区信息并将其添加到时间中。以UTC格式保存是什么意思?时间戳看起来不像是UTC。您是指带有时区信息的ISO格式吗?2015-03-30 07:19:06.746037+02应该是偏移量为+02:00的时区中的实际时间,而不是UTC。它似乎已经被转换了。你不需要再多加两个小时,你是对的,所有的事情都在数据库和python对象级别上处理,当我想把它翻译成文本时,问题就出现了。正如我之前所说的,我想以他们已知的格式向我的前端用户显示日期/时间。简单的date.strftime将输出时间信息,而不考虑时区。即使date对象中存在信息,它也会关闭2h,所以我添加了2h。我只是不确定这是否是一个好方法。我不知怎么得出结论,我的数据库中的时间戳是错误的,正如@Bernhard和你说的时区已经在那里了。我做了一些测试,并用现在的PostgresSQL(而不是python)将日期手动插入数据库,时间恢复到了预期的水平。如果我用python插入它,时间戳已经关闭了。如果现在是下午3点13分,数据库将保持1.13分+2小时的值,这可能是问题所在吗?我认为数据库会将python传递的时间视为UTC,因为python传递的时间可能很幼稚。由于数据库存储了带有时区信息的时间,它会在数据库的系统时间中返回它。所以我认为在写入数据库时,可能还需要包含时区信息。而现在是一个数据库函数,它使用时区信息生成时间。