为什么 python datetime replace timezone 返回不同的时区?
Why python datetime replace timezone is returning different timezone?
我正在从事 Python/Django 项目。我正在尝试让用户 select 使用 jQuery 插件 datetimepicker add-on 设置日期和时间。所以当我 select now 选项和 post data django 正在节省 UTC 偏移量的时间。这是保存在数据库中的内容,2017-03-30 13:38:00+00:00
。我需要从用户的时区转换这个时间并将其作为 utc 保存在系统中。因为稍后我会有脚本 运行,它会在数据库中查找小于 utc 时间的数据。
实际上脚本是让用户post网站上的信息,让他们选择发布日期和时间。因此,例如,如果使用 posted 一篇将于芝加哥时间 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 表单创建表单。我在其中添加了 class 作为属性并使用 jquery 插件,
$('.datepicker').datetimepicker({
timeFormat: 'HH:mm',
stepHour: 1,
stepMinute: 1,
});
所以当用户提交表单时,post 方法是我的代码,
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's localize
函数。这仅在 datetime
没有附加时区时有效,但由于您知道时区不正确,您可以先删除它。
tz = pytz.timezone('America/Chicago')
dt = tz.localize(dt.replace(tzinfo=None))
datetime replace(tzinfo = ...)
函数的命名很不幸。事实上,它的行为是随机的。不要使用这个!
Mark 的回答是要走的路。使用本地化。
我正在从事 Python/Django 项目。我正在尝试让用户 select 使用 jQuery 插件 datetimepicker add-on 设置日期和时间。所以当我 select now 选项和 post data django 正在节省 UTC 偏移量的时间。这是保存在数据库中的内容,2017-03-30 13:38:00+00:00
。我需要从用户的时区转换这个时间并将其作为 utc 保存在系统中。因为稍后我会有脚本 运行,它会在数据库中查找小于 utc 时间的数据。
实际上脚本是让用户post网站上的信息,让他们选择发布日期和时间。因此,例如,如果使用 posted 一篇将于芝加哥时间 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 表单创建表单。我在其中添加了 class 作为属性并使用 jquery 插件,
$('.datepicker').datetimepicker({
timeFormat: 'HH:mm',
stepHour: 1,
stepMinute: 1,
});
所以当用户提交表单时,post 方法是我的代码,
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's localize
函数。这仅在 datetime
没有附加时区时有效,但由于您知道时区不正确,您可以先删除它。
tz = pytz.timezone('America/Chicago')
dt = tz.localize(dt.replace(tzinfo=None))
datetime replace(tzinfo = ...)
函数的命名很不幸。事实上,它的行为是随机的。不要使用这个!
Mark 的回答是要走的路。使用本地化。