Python Django在同一应用程序中使用不同的时区

Python Django在同一应用程序中使用不同的时区,python,django,datetime,django-models,Python,Django,Datetime,Django Models,我正在处理Django关于休假管理的应用程序,其中有来自不同国家的员工。我将创建休假时的时间数据存储到DB中。现在,我希望插入DB的这个datetime是该特定员工所在位置的当前本地时间 例如,假设X先生在印度工作,Y先生在纽约工作。如果X申请休假,我希望它在当地时间创建(创建时间=在印度的任何时间),而当Y申请休假时,我希望它在纽约的任何时间创建。到目前为止,无论我在DB中插入什么,它都只作为UTC时间插入。如何解决这个问题 我正在努力实现这样的目标。。但它总是UTC userid = emp

我正在处理Django关于休假管理的应用程序,其中有来自不同国家的员工。我将创建休假时的时间数据存储到DB中。现在,我希望插入DB的这个datetime是该特定员工所在位置的当前本地时间

例如,假设X先生在印度工作,Y先生在纽约工作。如果X申请休假,我希望它在当地时间创建(创建时间=在印度的任何时间),而当Y申请休假时,我希望它在纽约的任何时间创建。到目前为止,无论我在DB中插入什么,它都只作为UTC时间插入。如何解决这个问题

我正在努力实现这样的目标。。但它总是UTC

userid = employees.objects.get(emp_id=request.user.username)

if employees.objects.get(emp_id=request.user.username).emp_loc == 'IND':
    tzone=pytz.timezone('Asia/Calcutta')
elif employees.objects.get(emp_id=request.user.username).emp_loc == 'MLA':
    tzone=pytz.timezone('Asia/Manila')
elif employees.objects.get(emp_id=request.user.username).emp_loc == 'MPLS':
    tzone=pytz.timezone('CST6CDT')

 timezone.activate(pytz.timezone(tzone))
 tnow=timezone.localtime(timezone.now())

if request.POST['action'] == 'Save changes':
        new_leave = leave.objects.create(employee=employees.objects.get(emp_id = userid.emp_id), start_date=sdt, end_date=edt, ltype=ltyp, message=des, date_created=tnow)

    new_leave.save()
急需帮助(


提前感谢………)

Django在数据库中以UTC格式存储日期时间信息,在内部使用时区感知的日期时间对象,并以模板和表单将其转换为最终用户的时区

在将日期时间保存到数据库之前,可以将其设置为时区。 转到你的settings.py和se使用_TZ设置为False

请阅读更新3部分

更新

PostgreSQL后端将日期时间存储为带时区的时间戳。实际上,这意味着它在存储时将日期时间从连接的时区转换为UTC,在检索时将日期时间从UTC转换为连接的时区

有关更多信息,您可以在下查看 迁移指南部分

更新2

无论您是否使用postgresql,如果要保存多个时区,您必须设置=False

然后按照上面的步骤获取本地时区中的日期时间

PS:这不是最佳做法,请参见:

更新3

前面的方法虽然澄清了问题,但不推荐使用

  • 保持USE_TZ=True(如果您的django版本支持)
  • 将DateTimeField中创建的_重命名为utc_created_
  • 通过添加3个附加字段扩展django模型:
    • 在中创建的日期字段本地\u
    • 本地时间创建的时间域
    • CharField创建的\u时区(不管是什么)
  • override model save()-(这只是一个示例,请检查执行此操作的最佳方法)
  • def保存(self,*args,**kwargs):
    dt=self.utc\u创建于
    如果dt:
    self.local_created_date=dt.date()
    self.local\u create\u time=dt.time()
    super().save(*args,**kwargs)
    
  • 在表单中(请确保在admin.py中使用此表单)

  • 但我希望它存储在数据库中。是否有任何可能的方法?是的,您可以这样做,我已编辑了我的答案,请检查。感谢您的努力,但UTC时间仍存储在数据库中:/in database中,它将始终以UTC格式显示时区信息,但当您在模板中显示它时,它将自动转换为用户的时区。无法将非UTC存储在DB中?
        import pytz
        from datetime import datatime
    
        leave = leave.objects.get(pk=1)
        time_zone = pytz.timezone('America/Bogota') # set timezone here
    
        # Before save
        leave.start_date = time_zone.localize(datetime.now())
        leave.save()
        leave.start_date
        > datetime.datetime(2020, 6, 17, 11, 50, 25, tzinfo=<DstTzInfo 'America/Bogota' -05-1 day, 19:00:00 STD>)
          # when USE_TZ is False
    
    import pytz
    
    leave = leave.objects.get(pk=1)
    time_zone = pytz.timezone(leave.timezone) # set timezone here
    
    # OR on retrieval
    leave_start_date = time_zone.localize(leave.start_date) # timezone aware datetime
    
        utc_created_at = models.DateTimeField(.....)
    
    local_created_date = models.DateField(blank=True, .....)
    local_created_time = models.TimeField(blank=True, .....)
    local_timezone = models.models.CharField(verbose_name="time zone", default=settings.TIME_ZONE, max_length=40)
    
    import pytz
    TIME_ZONE_CHOICES = [
        (timezone, timezone) for timezone in pytz.common_timezones
    ]
    timezone = forms.ChoiceField(choices=TIME_ZONE_CHOICES)