Python: strftime 本地时间格式的 UTC 时间戳
Python: strftime a UTC timestamp to local time format
我想使用数据库结果中的时间戳并将其转换为我的语言环境时间格式。时间戳本身以 UTC 格式保存:2015-03-30 07:19:06.746037+02
。在使用 %d.%m.%Y %H:%M %z
格式调用 print value.strftime(format)
后,输出将为 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
值,can/should 可以用这个代替吗?该解决方案也需要支持夏令时。)
在你的问题中,时间戳已经在所需的时区内,所以你不需要做任何事情。
如果您想将其转换为其他时区,您应该可以使用;
YourModel.datetime_column.op('AT TIME ZONE')('your timezone name')
或者,
func.timezone('your timezone name', YourModel.datetime_column)
在 SQLAlchemy 级别。
在python级别,考虑使用pytz
当您使用时区感知数据库时间戳时,您不需要手动进行转换,除非您要显示的时区与系统时区不同。
当您将 datetime 对象读写到数据库时,会考虑 datetime 对象的时区信息,这意味着您得到的是本地时区的时间,在您的情况下为 +0200.
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
我想使用数据库结果中的时间戳并将其转换为我的语言环境时间格式。时间戳本身以 UTC 格式保存:2015-03-30 07:19:06.746037+02
。在使用 %d.%m.%Y %H:%M %z
格式调用 print value.strftime(format)
后,输出将为 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
值,can/should 可以用这个代替吗?该解决方案也需要支持夏令时。)
在你的问题中,时间戳已经在所需的时区内,所以你不需要做任何事情。
如果您想将其转换为其他时区,您应该可以使用;
YourModel.datetime_column.op('AT TIME ZONE')('your timezone name')
或者,
func.timezone('your timezone name', YourModel.datetime_column)
在 SQLAlchemy 级别。
在python级别,考虑使用pytz
当您使用时区感知数据库时间戳时,您不需要手动进行转换,除非您要显示的时区与系统时区不同。 当您将 datetime 对象读写到数据库时,会考虑 datetime 对象的时区信息,这意味着您得到的是本地时区的时间,在您的情况下为 +0200.
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