python - 将 UTC 日期时间字符串转换为本地日期时间

我从来不需要在 UTC 之间转换时间。最近有一个要求让我的应用程序能够感知时区,我一直在绕圈子。很多关于将本地时间转换为 UTC 的信息,我发现这些信息相当基本(也许我也做错了),但我找不到任何关于轻松将 UTC 时间转换为最终用户时区的信息。

简而言之,android 应用程序向我发送(appengine 应用程序)数据,并且在该数据中是一个时间戳。将该时间戳存储到我正在使用的 utc 时间:

datetime.utcfromtimestamp(timestamp)

这似乎奏效了。当我的应用程序存储数据时,它会提前 5 小时存储(我是 EST -5)

数据存储在 appengine 的 BigTable 中,当检索到它时,它会以字符串的形式出现,如下所示:

"2011-01-21 02:37:21"

如何将此字符串转换为用户正确时区的 DateTime?

另外,用户时区信息的推荐存储空间是多少? (您通常如何存储 tz 信息,即:“-5:00”或“EST”等?)我确定我的第一个问题的答案可能包含第二个答案的参数。

最佳答案

如果您不想提供自己的 tzinfo 对象,请查看 python-dateutil图书馆。它在 zoneinfo (Olson) database 之上提供 tzinfo 实现。这样您就可以通过一个有点规范的名称来引用时区规则。

from datetime import datetime
from dateutil import tz

# METHOD 1: Hardcode zones:
from_zone = tz.gettz('UTC')
to_zone = tz.gettz('America/New_York')

# METHOD 2: Auto-detect zones:
from_zone = tz.tzutc()
to_zone = tz.tzlocal()

# utc = datetime.utcnow()
utc = datetime.strptime('2011-01-21 02:37:21', '%Y-%m-%d %H:%M:%S')

# Tell the datetime object that it's in UTC time zone since 
# datetime objects are 'naive' by default
utc = utc.replace(tzinfo=from_zone)

# Convert time zone
central = utc.astimezone(to_zone)

编辑扩展示例以显示 strptime 用法

编辑 2 修复 API 使用以显示更好的入口点方法

编辑 3 包括时区自动检测方法 (Yarin)

https://stackoverflow.com/questions/4770297/

相关文章:

python - 将带参数的函数传递给Python中的另一个函数?

python - 在 Python 中将字符串日期转换为时间戳

linux - 如何对目录中的所有文件执行grep操作?

linux - 在fish shell中定义别名

linux - crontab 星期几语法

python - 如何检查我是否在 Python 中的 Windows 上运行?

python - 浅拷贝、深拷贝和普通赋值操作有什么区别?

python - _csv.Error : field larger than field limi

linux - 如何在 Linux VM 的控制台上向上/向下滚动

linux - CLOCK_REALTIME 和 CLOCK_MONOTONIC 的区别?