python - 在 Python 中将时区感知日期时间转换为本地时间

标签 python django datetime iso8601

如何将可识别时区的日期时间对象转换为本地时区的等效非时区识别日期时间?

我的特定应用程序使用 Django(尽管这实际上是一个通用的 Python 问题):

import iso8601

....

date_str="2010-10-30T17:21:12Z"

....

d = iso8601.parse_date(date_str)

foo = app.models.FooModel(the_date=d)
foo.save()

这会导致 Django 抛出错误:

raise ValueError("MySQL backend does not support timezone-aware datetimes.")

我需要的是:

d = iso8601.parse_date(date_str)
local_d = SOME_FUNCTION(d)
foo = app.models.FooModel(the_date=local_d)

SOME_FUNCTION会是什么?

最佳答案

一般来说,要将任意时区感知日期时间转换为天真的(本地)日期时间,我会使用 pytz 模块和 astimezone 转换为本地时间, 和 replace 使日期时间变得幼稚:

In [76]: import pytz

In [77]: est=pytz.timezone('US/Eastern')

In [78]: d.astimezone(est)
Out[78]: datetime.datetime(2010, 10, 30, 13, 21, 12, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)

In [79]: d.astimezone(est).replace(tzinfo=None)
Out[79]: datetime.datetime(2010, 10, 30, 13, 21, 12)

但由于您的特定日期时间似乎在 UTC 时区,您可以这样做:

In [65]: d
Out[65]: datetime.datetime(2010, 10, 30, 17, 21, 12, tzinfo=tzutc())

In [66]: import datetime

In [67]: import calendar

In [68]: datetime.datetime.fromtimestamp(calendar.timegm(d.timetuple()))
Out[68]: datetime.datetime(2010, 10, 30, 13, 21, 12)

顺便说一句,您最好将日期时间存储为简单的 UTC 日期时间,而不是简单的本地日期时间。这样,您的数据与本地时间无关,并且您仅在必要时转换为本地时间或任何其他时区。有点类似于尽可能使用 unicode,并且仅在必要时进行编码。

因此,如果您同意将日期时间存储在原始 UTC 中是最好的方法,那么您需要做的就是定义:

local_d = d.replace(tzinfo=None)

关于python - 在 Python 中将时区感知日期时间转换为本地时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5452555/

相关文章:

python - 为什么 numpy.datetime64 会给出一系列年份的错误?

python - 如何使用 Graphene GraphQL 解析嵌套在另一种类型中的字段?

python - 如何更改 AWS 中 API 授权方的错误消息?

Django 数据库错误 : relation "django_site"

django - 500 错误与 404 错误哪个更可取?

sql - hive -如果cast(col as timestamp)为零,为什么要删除毫秒数呢?

python - 循环遍历 Python 字典

python - 在 Pandas 中将多列分组为一列

python - url路径中的django 2.2.5 URL正则表达式

asp.net-mvc - 如何修复jQuery datepicker的区域设置,使其可在Firefox和IE7中使用?