1

我正在使用 Django。

在设置中:

TIME_ZONE = 'Europe/Copenhagen'
USE_TZ = True

由于 DST,时钟在 2013 年 3 月 31 日跳过一个小时。01:59 到 03:00

我认为:

日期和时间以当地时间给出。我希望这些以 UTC 格式插入。

下面的代码正确保存为 UTC,但给出 RuntimeWarning: DateTimeField received a naive datetime

the_date = datetime.datetime(2013, 3, 31, 1, 59)
hit = hits(date= the_date); hit.save(); # Correctly saved as 00:59:00

the_date = datetime.datetime(2013, 3, 31, 3, 1)
hit = hits(date= the_date); hit.save(); # Correctly saved as 01:01:00

我想我可以通过让日期时间知道来避免警告。它确实避免了警告,但现在转换是错误的。

tz = timezone(settings.TIME_ZONE)
the_date = datetime.datetime(2013, 3, 31, 3, 1, tzinfo = tz)
hit = hits(date= the_date); hit.save(); # Incorrectly saved as 02:01:00

以下工作,没有运行时错误:

I have installed pytz.
the_date = local_tz.localize(datetime.datetime(2013, 3, 31, 3, 1))

解决我的问题:

我知道 tzinfo 不起作用,因为它不考虑夏令时。好吧,我不会用它。但是当以下似乎起作用时,我感到困惑:

the_date = datetime.datetime.now(local_tz)

这在冬季(它减去 1 小时以获得 utc)和当我将计算机系统时间更改为夏季的日期(它减去 2 小时以获得 utc)时都正确插入为 utc。

我的问题:

.now(local_tz) 工作还是我测试错了?为什么这与 tzinfo = tz 不同?还是我使用 tzinfo 错误?

4

1 回答 1

0

我建议尽快转换为 UTC,并且只在内部使用 UTC。保存跨时区移动的情况(例如船舶)并且确实需要保存时区信息,对于恒定时区的情况,仅使用本地时间进行输入/输出并将其转换为 UTC 在用户界面上要简单得多.

要将本地时间转换为 UTC,您需要使用pytz.timezone.normalize处理夏令时和其他时区转换的方法。请参阅文档的这一部分pytz。在您的情况下,要将本地日期时间转换为 UTC,您需要以下内容:

from pytz import timezone, utc

local_tz = timezone(settings.TIME_ZONE)
local_dt = datetime.datetime(2013, 3, 31, 3, 1, tzinfo = local_tz)
utc_dt = utc.normalize(local_dt.astimezone(utc))
于 2012-11-13T13:21:24.007 回答