Python Django在同一应用程序中使用不同的时区
我正在处理Django关于休假管理的应用程序,其中有来自不同国家的员工。我将创建休假时的时间数据存储到DB中。现在,我希望插入DB的这个datetime是该特定员工所在位置的当前本地时间 例如,假设X先生在印度工作,Y先生在纽约工作。如果X申请休假,我希望它在当地时间创建(创建时间=在印度的任何时间),而当Y申请休假时,我希望它在纽约的任何时间创建。到目前为止,无论我在DB中插入什么,它都只作为UTC时间插入。如何解决这个问题 我正在努力实现这样的目标。。但它总是UTCPython Django在同一应用程序中使用不同的时区,python,django,datetime,django-models,Python,Django,Datetime,Django Models,我正在处理Django关于休假管理的应用程序,其中有来自不同国家的员工。我将创建休假时的时间数据存储到DB中。现在,我希望插入DB的这个datetime是该特定员工所在位置的当前本地时间 例如,假设X先生在印度工作,Y先生在纽约工作。如果X申请休假,我希望它在当地时间创建(创建时间=在印度的任何时间),而当Y申请休假时,我希望它在纽约的任何时间创建。到目前为止,无论我在DB中插入什么,它都只作为UTC时间插入。如何解决这个问题 我正在努力实现这样的目标。。但它总是UTC userid = emp
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 前面的方法虽然澄清了问题,但不推荐使用
- 在中创建的日期字段本地\u
- 本地时间创建的时间域
- CharField创建的\u时区(不管是什么)
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)
但我希望它存储在数据库中。是否有任何可能的方法?是的,您可以这样做,我已编辑了我的答案,请检查。感谢您的努力,但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)