正确使用 utc 时间戳和本地日期时间
Correct usage of utc timestamps and local datetime
我已经使用 time.time()
跨客户端应用程序生成时间戳。这些时间戳被累积并分批发送到外部独立位置。
在客户端应用程序上呈现这些时间戳时,我打算使用 datetime.fromtimestamp(ts_from_external_source)
来创建本地 datetime
对象,而不定义时区,因此它默认采用本地。
这是推荐的方法吗?
是的,这是一个很好的方法:您存储 "Unix epoch" 样式时间,并在显示它们之前将它们转换为您需要的任何本地时间。
如果您仅将其用于显示时间戳,则可以使用代表本地时间的原始日期时间对象。
datetime.fromtimestamp(ts_from_external_source)
应该在 DST 转换期间工作(本地时间可能不明确,但如果我们忽略闰秒,POSIX 时间戳就不会)。尽管如果本地时区 had/will 在 和 时具有不同的 UTC 偏移量,但对于 past/future 的日期可能会失败,但底层 C 库不使用历史时区the tz database 等数据库(Linux、OS X 使用它。python on Windows -- 可能不会)。
datetime.fromtimestamp(ts_from_external_source)
对于大多数时区的最近日期应该没问题。
您可以使用日期为 2010-2015 的 Europe/Moscow
时区进行测试(时区规则在那个时期发生了变化)。
您可以使用 pytz
模块提供 tz 数据库:
from datetime import datetime, timedelta
from tzlocal import get_localzone # $ pip install tzlocal
import pytz # $ pip install pytz
tz = get_localzone() # get the local timezone as pytz timezone (with historical data)
utc_dt = datetime(1970, 1, 1, tzinfo=pytz.utc) + timedelta(seconds=ts_from_external_source)
dt = utc_dt.astimezone(tz)
或:
dt = datetime.fromtimestamp(ts_from_external_source, tz)
运行 these tests 查看 datetime + timedelta
和 fromtimestamp()
是否在您的平台上产生不同的结果。
我已经使用 time.time()
跨客户端应用程序生成时间戳。这些时间戳被累积并分批发送到外部独立位置。
在客户端应用程序上呈现这些时间戳时,我打算使用 datetime.fromtimestamp(ts_from_external_source)
来创建本地 datetime
对象,而不定义时区,因此它默认采用本地。
这是推荐的方法吗?
是的,这是一个很好的方法:您存储 "Unix epoch" 样式时间,并在显示它们之前将它们转换为您需要的任何本地时间。
如果您仅将其用于显示时间戳,则可以使用代表本地时间的原始日期时间对象。
datetime.fromtimestamp(ts_from_external_source)
应该在 DST 转换期间工作(本地时间可能不明确,但如果我们忽略闰秒,POSIX 时间戳就不会)。尽管如果本地时区 had/will 在 和 时具有不同的 UTC 偏移量,但对于 past/future 的日期可能会失败,但底层 C 库不使用历史时区the tz database 等数据库(Linux、OS X 使用它。python on Windows -- 可能不会)。
datetime.fromtimestamp(ts_from_external_source)
对于大多数时区的最近日期应该没问题。
您可以使用日期为 2010-2015 的 Europe/Moscow
时区进行测试(时区规则在那个时期发生了变化)。
您可以使用 pytz
模块提供 tz 数据库:
from datetime import datetime, timedelta
from tzlocal import get_localzone # $ pip install tzlocal
import pytz # $ pip install pytz
tz = get_localzone() # get the local timezone as pytz timezone (with historical data)
utc_dt = datetime(1970, 1, 1, tzinfo=pytz.utc) + timedelta(seconds=ts_from_external_source)
dt = utc_dt.astimezone(tz)
或:
dt = datetime.fromtimestamp(ts_from_external_source, tz)
运行 these tests 查看 datetime + timedelta
和 fromtimestamp()
是否在您的平台上产生不同的结果。