我正在从事Python/Django项目。我正在尝试让用户使用 jQuery 插件日期时间选择器插件选择日期和时间。因此,当我选择现在选项并发布数据时,django 正在节省 UTC 偏移量的时间。这是保存在数据库中的内容,2017-03-30 13:38:00+00:00
.我需要从用户的时区转换此时间并将其保存为UTC在系统中。因为稍后我将运行脚本,该脚本将在数据库中查找小于 UTC 时间的数据。
实际上,脚本是让用户在网站上发布信息,并让他们选择发布日期和时间。例如,如果使用发布了一篇将于芝加哥时间 4 月 2 日下午 1 点发表的文章,我不希望其他用户在此时间之前阅读该文章。因此,世界各地的人们都可以在芝加哥的 4 月 2 日和下午 1 点阅读文章。那么如何使此功能正常工作呢?
我的解决方案是获取时间并使用replace(tzinfo=pytz.timezone('America/Chicago'))
删除它的时区信息,当我打印时间时,我得到2017-03-30 13:38:00-05:51
.现在的实际偏移量是-05:00
.谁能帮助我告诉我我做错了什么?
我为表单所做的是,我的模型中publish_date
对象,并且我正在使用django表单来创建表单。我已经在其中添加了类作为属性并使用jquery插件,
$('.datepicker').datetimepicker({
timeFormat: 'HH:mm',
stepHour: 1,
stepMinute: 1,
});
因此,当用户提交表单时,在发布方法这是我的代码时,
form = PublishForm(request.POST)
if form.is_valid():
f = form.save(commit=False)
f.created_by_user_id = request.user.id
f.save()
而不是为了获得日期,我所做的只是f.publish_date
和我使用虱子replace
和localize
的其他选项非常标准。
谢谢
如评论中所述,您似乎有两个问题。首先,datetimepicker
正在保存带有 UTC 时区偏移量的日期和时间,而它应该应用不同的时区或完全保留时区偏移量。其次是pytz
使用了错误的偏移量。
我不知道如何解决第一个问题,但我可以帮助你解决第二个问题。你需要使用 pytz 的localize
函数。这仅在datetime
没有附加时区时才有效,但由于您知道时区不正确,因此您可以先将其删除。
tz = pytz.timezone('America/Chicago')
dt = tz.localize(dt.replace(tzinfo=None))
日期时间replace(tzinfo = ...)
函数的命名很不幸。事实上,它的行为是随机的。不要用这个!
马克的回答是要走的路。使用本地化。