所以我有这个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
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
尝试解决方案
对我来说,最明显的解决方案是将Post.objects.filter(created__in_range=<some range>)转换为指定的time_zone,然后执行created
Note
主要的问题似乎是Pyzt,它需要一个非常具体的格式“美国/洛杉矶”w.e格式,这是。而不是像"PST“这样的缩短时区格式。
发布于 2021-12-22 07:24:43
取UTC月份的第一个时刻(1点午夜)和下一个月的UTC的第一个时刻,用您想要的时区来调整它们,执行posted__range=(a,b)查询吗?
这可能有效(但约会数学是很微妙的.)。
这需要python-dateutil使end时间计算具有鲁棒性。
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")打印出来
2021-06-01 07:00:00+00:00
2021-07-01 07:00:00+00:00这似乎是对的。
然后,您可能会进行如下查询
posts = Post.objects.filter(created__range=(
start_as_tz_in_utc,
end_as_tz_in_utc,
))发布于 2021-12-21 19:46:35
我会尝试这样的方法:
假设您要以given_month的形式通过给定的月份,以given_year的形式传递给定的年份,以given_timezone的形式传递给定的时区
Model_Name.objects.filter(created.split('/',4)[2]=given_month,created.split('/',4)[3]=given_year, created.split('/',4)[4]=given_timezone)这应该从您的帖子的月、年和时区部分获得值。你可能需要玩我给你的东西。另外,最好从一个用户添加到另一个帖子,这样你就可以用我给出的答案过滤用户的帖子。在大多数情况下,这将是一个更有效的,假设有更多的帖子比用户。这应该能让你走上正确的轨道。
发布于 2021-12-28 17:12:30
考虑以UTC日期时间保存记录,不要尝试保存任何时区偏移量。只需记录数据到达UTC服务器的时间,让浏览器或应用程序将其转换到它们配置的时区。如果您的用户是在中国中创建了一个帖子,然后在第二天迁移到纽约并阅读之前创建的帖子,那么created_at的日期时间对于两个位置都是一样的,因为它是通用的。因此,如果用户B想恢复用户A自去年10月以来记录的数据,那么查询created_at::date>="2021-10-01"就很容易了
https://stackoverflow.com/questions/70440712
复制相似问题