如何在UTC

时间:2016-09-02 07:08:01

标签: django datetime

我已在设置中配置了我的时区,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添加到第二个日期,但我有同样的问题。

我的问题是,如何将这六个小时添加到我用作参数的日期?我需要知道日期时间,并且我无法在模型中进行任何更改,我只能更改我发送到查询集的参数。

3 个答案:

答案 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'))