首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django -给定的时区、月和年将在该时区中创建所有在该日期创建的帖子。

问Django -给定的时区、月和年将在该时区中创建所有在该日期创建的帖子。
EN

Stack Overflow用户
提问于 2021-12-21 19:31:20
回答 4查看 1.1K关注 0票数 2

所以我有这个Post模型。我希望能够检索所有的帖子,在一个月,一年内,在特定的时区是created。

我的目标是实现一个功能,在这个功能中,世界上任何地方的用户,比如说,在PST中,都可以从某个月的时区中获得其他人的所有帖子。因此,假设用户A在EST,用户B在PST (比EST晚3小时)。用户B希望看到用户A在2021年10月创建的所有帖子。由于应用程序将显示用户当前所在的时区中的帖子(我们在UTC发送日期时间,然后前端转换为本地时间),那么应用程序只应将用户A在2021年10月PST创建的所有帖子发送给用户B。例如,如果用户A( EST中的用户)在10月31日晚11点(2021年10月31日晚上8点)和2021年11月1日凌晨1点(2021年10月31日晚上10点)发了一篇文章,那么用户B应该把这两篇文章都拿回来,因为第二篇文章是11月在EST制作的,而10月份是在PST。

model.py

代码语言:javascript
复制
class Post(models.Model):
    uuid = models.UUIDField(primary_key=True)
    created = models.DateTimeField('Created at', auto_now_add=True)
    updated_at = models.DateTimeField('Last updated at', auto_now=True, blank=True, null=True)
    creator = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="post_creator")
    body = models.CharField(max_length=POST_MAX_LEN)

例如,如果用户在11月创建10个帖子,在2021年12月在PST创建2个帖子。然后我有一个关于month、year和time_zone的观点,假设url看起来像/post/<int:month>/<int:year>/<str:time_zone>和用户pings /post/11/2021/PST,那么它应该返回11月份的10个帖子。如何在给定时区、月和年的时区中返回一个月和一年的所有帖子?

注意:要考虑的棘手的边缘情况是,如果他们在一个月的最后一天发布非常晚。根据时区的不同,世界协调时的12/31/2021可能是01/01/2022。因为Django将datetime字段存储在UTC中,所以需要将created转换为给定的time_zone,然后从指定的month和year获取帖子。

设置:

3.2.9

  • Postgresql

  • Django

尝试解决方案

对我来说,最明显的解决方案是将Post.objects.filter(created__in_range=<some range>)转换为指定的time_zone,然后执行created

Note

主要的问题似乎是Pyzt,它需要一个非常具体的格式“美国/洛杉矶”w.e格式,这是。而不是像"PST“这样的缩短时区格式。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-12-22 07:24:43

取UTC月份的第一个时刻(1点午夜)和下一个月的UTC的第一个时刻,用您想要的时区来调整它们,执行posted__range=(a,b)查询吗?

这可能有效(但约会数学是很微妙的.)。

这需要python-dateutil使end时间计算具有鲁棒性。

代码语言:javascript
复制
import datetime
import pytz

from dateutil.relativedelta import relativedelta
from django.utils import timezone

year = 2021
month = 6
tz = pytz.timezone("America/Los_Angeles")

start = datetime.datetime(year, month, 1)
end = start + relativedelta(months=1)
start_as_tz_in_utc = tz.localize(start).astimezone(pytz.utc)
end_as_tz_in_utc = tz.localize(end).astimezone(pytz.utc)
print(start_as_tz_in_utc, end_as_tz_in_utc, sep="\n")

打印出来

代码语言:javascript
复制
2021-06-01 07:00:00+00:00
2021-07-01 07:00:00+00:00

这似乎是对的。

然后,您可能会进行如下查询

代码语言:javascript
复制
posts = Post.objects.filter(created__range=(
  start_as_tz_in_utc,
  end_as_tz_in_utc,
))
票数 3
EN

Stack Overflow用户

发布于 2021-12-21 19:46:35

我会尝试这样的方法:

假设您要以given_month的形式通过给定的月份,以given_year的形式传递给定的年份,以given_timezone的形式传递给定的时区

代码语言:javascript
复制
Model_Name.objects.filter(created.split('/',4)[2]=given_month,created.split('/',4)[3]=given_year, created.split('/',4)[4]=given_timezone)

这应该从您的帖子的月、年和时区部分获得值。你可能需要玩我给你的东西。另外,最好从一个用户添加到另一个帖子,这样你就可以用我给出的答案过滤用户的帖子。在大多数情况下,这将是一个更有效的,假设有更多的帖子比用户。这应该能让你走上正确的轨道。

票数 0
EN

Stack Overflow用户

发布于 2021-12-28 17:12:30

考虑以UTC日期时间保存记录,不要尝试保存任何时区偏移量。只需记录数据到达UTC服务器的时间,让浏览器或应用程序将其转换到它们配置的时区。如果您的用户是在中国中创建了一个帖子,然后在第二天迁移到纽约并阅读之前创建的帖子,那么created_at的日期时间对于两个位置都是一样的,因为它是通用的。因此,如果用户B想恢复用户A自去年10月以来记录的数据,那么查询created_at::date>="2021-10-01"就很容易了

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70440712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档