Python Django:tzinfo 不适用于数据库插入。但是为什么 .now(local_tz) 有效?



我正在使用Django。

在设置中:

TIME_ZONE = 'Europe/Copenhagen'
USE_TZ = True

由于夏令时,时钟在2013-3-31跳了一个小时。01:59转到03:00

我的看法:

日期和时间以当地时间表示。我想把这些作为utc插入。

下面的代码正确地保存为UTC,但给出了运行时间警告:DateTimeField收到了一个幼稚的日期时间

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?

我建议尽快转换为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))

相关内容

最新更新