代码之家  ›  专栏  ›  技术社区  ›  Eugene

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

  •  5
  • Eugene  · 技术社区  · 6 年前

    class Entity(models.Model):
        name = models.CharField(max_length=255)
        date = models.DateTimeField()
    

    用户可以向我的DRF端点发送请求 /api/v1/entity/ Entity 对象,由日期参数确定。当此应用程序的用户不在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年6月18日23:00:00Z 2018-06-19T23:00:00Z .在用户的时区中,获取一天(或一个日期范围)内所有实体的正确方法是什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   JPG    6 年前

    如果我理解正确,你必须改变当地人 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