我已在设置中配置了我的时区,America/Guatemala
我的模型中有一些日期时间字段,我使用default=timezone.now
,但它没有保存我的本地小时,即UTC -6:00,将其保存为UTC-00:00。我无法改变这一点,因为现在以这种方式存储在数据库中的一些重要数据。
我在查询集中检索数据时遇到问题,我在request.POST
中发送一个字符串,如下所示:
date='1/09/2016'
我试过这个来配置我的查询日期:
f=date.split('/')
if len(f)>1:
initialdate=datetime.datetime(int(f[2]),int(f[1]),int(f[0]),0,0,0,tzinfo=pytz.UTC)
finaldate=datetime.datetime(int(f[2]),int(f[1]),int(f[0]),23,59,59,tzinfo=pytz.UTC)
这是我的查询集:
sale=Sale.objects.filter(Q(pk=int(cod))|Q(sale_date__range=(initialdate,finaldate)))
但由于我保存的数据与当地日期和时间之间存在6小时的差异,如果我在当地时间下午6:01存储销售,则保存的数据将存储为明天00:01 am。如果我想检查我今天所做的所有销售,它不会在下午6点之后向我显示销售情况,因为它们会在不同的日期保存。
我有另外一个查询,我发送两个不同的日期,我使用相同的代码,我只是将时间0,0,0
添加到第一个日期,23,59,59
添加到第二个日期,但我有同样的问题。
我的问题是,如何将这六个小时添加到我用作参数的日期?我需要知道日期时间,并且我无法在模型中进行任何更改,我只能更改我发送到查询集的参数。
答案 0 :(得分:0)
我也有这个问题。而我所做的是: 整天的日期范围是:00:00:00-23:59:59,这是本地日期时间,但是数据库中的日期时间已经转换为utc,所以我只需将本地日期时间分为6小时,你就可以了这样做;
import datetime
f=date.split('/')
if len(f)>1:
initialdate=datetime.datetime(int(f[2]),int(f[1]),int(f[0]),0,0,0,tzinfo=pytz.UTC)
finaldate=datetime.datetime(int(f[2]),int(f[1]),int(f[0]),23,59,59,tzinfo=pytz.UTC)
initialdate = initialdate - datetime.timedelta(hours=6)
finaldate = finaldate - datetime.timedelta(hours=6)
答案 1 :(得分:0)
修改了日期
要简单地更改六小时后的日期,您可以使用datetime
' s timedelta
。
要更改查询中的sale_date
个对象,您只需执行以下操作:
import datetime
import pytz
for s in sale:
sale_date = sale_date - datetime.timedelta(hours=6)
sale_date = sale_date.replace(tzinfo=pytz.timezone("America/Guatemala"))
s.save()
要更改所有sale_date
个对象的Sale
:
import datetime
import pytz
all_sales = Sale.objects.all()
for sale in all_sales:
sale_date = sale_date - datetime.timedelta(hours=6)
sale_date = sale_date.replace(tzinfo=pytz.timezone("America/Guatemala"))
sale.save()
另外,要解析包含时间信息的字符串,请使用strptime
:
import datetime
date='1/09/2016'
parsed_date = datetime.datetime.strptime(date, '%w/%m%Y')
有关详情here
答案 2 :(得分:0)
import pytz
from django.utils import timezone
initialdate = datetime.datetime.combine(date, datetime.time.min.replace(tzinfo=timezone.UTC())).astimezone(pytz.timezone('America/Guatemala'))
finaldate = datetime.datetime.combine(date, datetime.time.max.replace(tzinfo=timezone.UTC())))).astimezone(pytz.timezone('America/Guatemala'))