为啥 python datetime replace timezone 返回不同的时区?

Posted

技术标签:

【中文标题】为啥 python datetime replace timezone 返回不同的时区?【英文标题】:Why python datetime replace timezone is returning different timezone?为什么 python datetime replace timezone 返回不同的时区? 【发布时间】:2017-08-24 20:47:15 【问题描述】:

我正在开发 Python/Django 项目。我试图让用户使用 jQuery 插件datetimepicker add-on 选择日期和时间。因此,当我选择 now 选项并发布数据时,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,
            );

所以当用户提交表单时,在 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,而我使用 lice replacelocalize 的其他选项非常标准。

谢谢

【问题讨论】:

那么即使时间保存为 UTC 偏移量,它也不是 UTC 时间? 也许***.com/questions/11473721/… 解释了这个问题。 这不是正确的 UTC 时间。例如,我在中午 12 点从芝加哥发布表格,因此它应该将时间保存为 UTC 下午 5 点,而不是将 12 点作为 UTC 时间,即芝加哥时间上午 7 点。 所以你似乎有两个问题。首先是datetimepicker 正在保存应该应用时区的UTC 日期/时间。其次是使用pytz 使用了错误的偏移量。我之前给你的链接肯定会帮助解决第二个问题。 我尝试使用localize 选项,但它给了我错误Not naive datetime (tzinfo is already set),因为时区已由 datetimepicker 设置。 【参考方案1】:

正如 cmets 中所述,您似乎有两个问题。首先是datetimepicker 正在使用UTC 时区偏移量保存日期和时间,此时它应该应用不同的时区或完全不使用时区偏移量。其次是pytz 使用了错误的偏移量。

我不知道如何解决第一个问题,但我可以帮助您解决第二个问题。您需要使用pytz's localize 函数。这仅在datetime 没有附加时区时有效,但由于您知道时区不正确,因此您可以先将其删除。

tz = pytz.timezone('America/Chicago')
dt = tz.localize(dt.replace(tzinfo=None))

【讨论】:

【参考方案2】:

日期时间replace(tzinfo = ...) 函数的命名是不幸的。事实上,它的行为是随机的。不要使用这个!

马克的答案是要走的路。使用本地化。

【讨论】:

以上是关于为啥 python datetime replace timezone 返回不同的时区?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Python 的 datetime.time 有 tzinfo 参数?

python: 为啥 datetime.now() 的 tzinfo 没有? [复制]

为啥我无法在 python 中正确使用 str.replace() 方法 [关闭]

python,如图选项replace的使用为啥是错的?谢谢

为啥 Python datetime 和 JS Date 不匹配?

PYTHON学习0044:函数---datetime模块详解--2019-8-11