zoukankan      html  css  js  c++  java
  • 在Django / DRF中正确处理日期时间/时区

    我正在尝试为我的网络应用程序进行正确的日期处理设置.我有一个看起来像这样的模型
    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

  • 相关阅读:
    C#多线程下更新UI的几种方法
    .net WebApi使用swagger 美化接口文档
    C#内存管理
    LINQ 推迟查询的执行
    C#多播委托详解
    泛型委托
    使用 ref 和 out 传递数组注意事项
    何时使用委托而不使用接口
    委托中的协变和逆变
    细说SQL Server数据类型
  • 原文地址:https://www.cnblogs.com/catgatp/p/13178884.html
Copyright © 2011-2022 走看看