我正在使用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))