在Django / DRF中正确处理日期时间/时区

摘要:
date_from=2018-06-18T23:00:00&date_to=2018-06-19T23:00:00
我正在尝试为我的网络应用程序进行正确的日期处理设置.我有一个看起来像这样的模型
class Entity(models.Model):
    name = models.CharField(max_length=255)
    date = models.DateTimeField()

用户可以向我的DRF端点/ api / v1 / entity /发送请求以获取此类实体的列表.现在要求用户应该能够在一天内请求所有Entity对象,这由date参数确定.日期以UTC格式存储在数据库中,而此应用的用户不在UTC时区.

用户可以创建具有以下日期2018-06-19T01:00:00 02:00的实体,该实体在数据库中存储为2018-06-18T23:00:00Z.现在,如果我尝试列出用户为2018-06-19创建的所有实体,则返回任何内容,但按2018-06-18过滤将返回一个条目.

这是我正在使用的代码设置:
http://127.0.0.1:8000/api/v1/entity/?date=2018-06-18.

def get_queryset(self):
    user = self.request.user
    entities = Entity.objects.filter(owner=user)
    date = self.request.query_params.get('date')
    if date:
        entities = entities.filter(date__date=date)
    return entities

因此,在这种情况下,适当的日期范围是2018-06-18T23:00:00Z – 2018-06-19T23:00:00Z.在用户的时区中获取一天(或日期范围)的所有实体的正确方法是什么?

如果我理解正确,您必须将本地DateTime转换为等效的UTC时间并查询数据库.所以我在下面定义了一个简单的时间转换函数
import pytz
from datetime import datetime
def convert_to_UTC(local_tz,dt_1,dt_2):
    """
    local_tz : any possible timezone which supports pytz lib (https://stackoverflow.com/questions/13866926/is-there-a-list-of-pytz-timezones)
    dt_1 and dt_2 : local datetime in string in this format ->> '%Y-%m-%dT%H:%M:%S'

    return a list as ->> [utc_equivalent_of_dt_1_in_string,utc_equivalent_of_dt_2_in_string]
    """
    format='%Y-%m-%dT%H:%M:%S'
    pytz_local_tz = pytz.timezone(local_time_zone)
    dt_obj_from_date_time = datetime.strptime(dt_1,format)
    dt_obj_to_date_time = datetime.strptime(dt_2,format)
    return [pytz_local_tz.localize(dt_obj_from_date_time).astimezone(tz=pytz.utc).strftime(format),
            pytz_local_tz.localize(dt_obj_to_date_time).astimezone(tz=pytz.utc).strftime(format)]

要使用此功能,请更改get_queryset()方法,如下所示,

def get_queryset(self):
    user = self.request.user
    entities = Entity.objects.filter(owner=user)
    date_from = self.request.query_params.get('date_from') date_to = self.request.query_params.get('date_to') if date_from and date_to: entities = entities.filter(date__range=convert_to_UTC('Asia/Kolkata', date_from, date_to))
    return entities

因此,网址将是,/ api / v1 / entity /?date_from = 2018-06-18T23:00:00& date_to = 2018-06-19T23:00:00

免责声明:文章转载自《在Django / DRF中正确处理日期时间/时区》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SQL Server性能调优之执行计划深度剖析 第二节 执行计划第一次实践Java版人脸识别SDK 虹软arcface (demo)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Django安装和启动

    1.django安装 在http://www.djangoproject.com/download/这个网站上可以下载django的最新版本。在下载时,要注意django版本和本机安装的Python版本是匹配的。在这个https://docs.djangoproject.com/en/dev/faq/install/#what-python-ve...

详解EBS接口开发之库存事务处理采购接收--补充

除了可以用 详解EBS接口开发之库存事务处理采购接收的方法还可以用一下方法,不同之处在于带有批次和序列控制的时候实现方式不同 The script will load records into the tables RCV_HEADERS_INTERFACE, RCV_TRANSACTIONS_INTERFACE,MTL_TRANSACTION_LOT...

JavaScript中的Date类型计算时间差

接触JavaScript不久,今日想写一个简单的秒表练练手,于是就想当然的写下了如下代码: vardate =new Date(currTime.getTime() - beginTime.getTime()); // currTime.getTime()=1329655993149 beginTime.getTime()=1329655991421 v...

mongo在windos下自动备份

数据备份 @echo off cd 备份路径 md %date:~0,4%-%date:~5,2%-%date:~8,2% 根据日期创建文件 cd 到mongo 安装目录,执行下面的指令 否则找不到 mongodump -h IP:端口 -u 账号 -p 密码 -d 集合 --authenticationDatabase admin -o 备份路...

js new Date()参数格式

最近在写页面使用new Date()获取时间戳在ie浏览器中测试发现无效;后来发现是参数格式问题, new Date()参数格式如下: 1、用整数初始化日期对象var date1 = new Date(2017,06,06); console.log(date1); // Thu Jul 06 2017 00:00:00 GMT+0800 (中国标准时间)...

java 实现获取当天,当周,当月,当季,当年的时间段

由于项目需求,现在要做一个排行榜,需要按照时间(日,周,月,季,年)来从sql中查询数据。 1、首先要做的就是怎样判断当前的时间段 查询资料知: 项目中关于时间的使用: 1、获取时间 Date date=new Date(); date.getDate(); // System.currentTimeMills(); 都是返回long型的数据, 2、以某种...