用Python将时区感知的日期时间转换为本地时间

2024-04-29 03:20:29 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将时区感知的datetime对象转换为本地时区的等效非时区感知datetime?

我的特定应用程序使用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)

一些函数是什么?


Tags: the对象djangoimportapp应用程序datetimedate
3条回答

一般来说,要将任意时区感知的日期时间转换为原始(本地)日期时间,我将使用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)

在Django的最新版本(至少1.4.1)中:

from django.utils.timezone import localtime

result = localtime(some_time_object)

一个可移植的健壮解决方案应该使用tz数据库。要将本地时区获取为^{}tzinfo对象,use ^{} module

#!/usr/bin/env python
import iso8601
import tzlocal # $ pip install tzlocal

local_timezone = tzlocal.get_localzone()
aware_dt = iso8601.parse_date("2010-10-30T17:21:12Z") # some aware datetime object
naive_local_dt = aware_dt.astimezone(local_timezone).replace(tzinfo=None)

注意:可能很容易使用如下内容:

#!/usr/bin/env python3
# ...
naive_local_dt = aware_dt.astimezone().replace(tzinfo=None)

但是,如果本地时区有一个变量utc offset,但python在给定平台上不使用历史时区数据库,则可能会失败。

相关问题 更多 >