如何解决Django-UTC到本地时间的转换失败
我想将UTC时间转换为本地时间
我的settings.py
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
我的模型。py
class UnauthorizedAccess(models.Model):
UnauthorizedAccessId = models.AutoField(primary_key=True,db_column='UnauthorizedAccessId')
Camera = models.ForeignKey(Camera,on_delete=models.CASCADE,db_column='CameraId')
AccessTime = models.DateTimeField()
Description = models.CharField(max_length=250)
class Meta:
db_table = "UnauthorizedAccess"
views.py
from datetime import date,datetime
from django.utils import timezone
from tzlocal import get_localzone
import pytz
@api_view(['POST'])
@permission_classes([])
def push_notification(request):
cam_id = request.data.get("CameraId").strip()
camera_ob = Camera.objects.get(CameraId=cam_id)
unauthorized_entry = UnauthorizedAccess(
Camera=camera_ob,AccessTime=timezone.now(),Description=unauthorized_access,)
unauthorized_entry.save()
return Response({msg: validation["FDP25"]},status=status.HTTP_200_OK)
except Exception as ex:
logging.getLogger("error_logger").exception(repr(ex))
return Response({msg: validation["FDP23"]},status=status.HTTP_400_BAD_REQUEST)
在保存时我尝试了AccessTime = datetime.now(tz = timezone.utc)和AccessTime = datetime.now() 现在我正在使用timezone.now()
我试图检索我的数据
我的views.py 从datetime导入日期开始,datetime 从django.utils导入时区 从tzlocal导入get_localzone 导入pytz
@api_view(['GET'])
@permission_classes([])
def notification(request):
try:
unauthorizedaccess_details = list()
tz = get_localzone()
notification_ob = UnauthorizedAccess.objects.all().order_by('-AccessTime')[:50]
for ob in notification_ob:
dev = Device.objects.get(Camera=ob.Camera)
tz = get_localzone()
localtz = ob.AccessTime.replace(tzinfo=pytz.utc).astimezone(tz)
date_time = localtz.strftime("%d/%m/%Y %I:%M:%S %p")
tz1 = ob.AccessTime.replace(tzinfo=pytz.UTC)
localtz1 = tz1.astimezone(timezone.get_current_timezone())
date_time1 = localtz1.strftime("%d/%m/%Y %I:%M:%S %p")
unauthorizedaccess_info = {
'id': ob.UnauthorizedAccessId,'DeviceName': dev.DeviceName,'Date': date_time,'Date1': date_time1,'Date2': ob.AccessTime,'Date3': ob.AccessTime.strftime("%d/%m/%Y %I:%M:%S %p"),'Access': ob.Description,'Type': '1'
}
unauthorizedaccess_details.append(unauthorizedaccess_info)
return JsonResponse(unauthorizedaccess_details,safe=False,status=status.HTTP_400_BAD_REQUEST)
我尝试了这些方法来获取正确的时间
当我使用本地主机作为url运行此程序时,我得到了这个答案(我仅显示1个设置数据作为示例)
{
"id": 124,"DeviceName": "FDP01","Date": "18/08/2020 06:14:43 PM","Date1": "18/08/2020 12:44:43 PM","Date2": "2020-08-18T12:44:43.127Z","Date3": "18/08/2020 12:44:43 PM","Access": "Unauthorized entry","Type": "1"
}
然后使用我的服务器网址获取的相同数据是
{
"id": 125,"Date": "18/08/2020 12:49:05 PM","Date1": "18/08/2020 12:49:05 PM","Date2": "2020-08-18T12:49:05.675Z","Date3": "18/08/2020 12:49:05 PM","Type": "1"
}
我希望服务器提供以下格式的答案:“ Date”:“ 18/08/2020 06:14:43 PM”(date1和Date2是我尝试过的代码示例)
使用服务器网址日期未转换为我的本地时区
- 我如何获得正确的日期?
- 我犯了什么错误?
解决方法
有几种方法可以实现这一目标。
Django设置“ TIME_ZONE”
根据docs,您可以将此设置设置为所需的任何有效时区。 Django负责在您在此处指定的时区中从数据库转换时间戳。 因为您将TIME_ZONE设置为'UTC',所以您没有使用此便捷功能。
手动转换DateTime对象
您可以自己从一个时区转换为另一个时区。
from django.utils import timezone
local_tz = timezone.get_current_timezone() # Asking django about the current timezone
# Django gets this information from the incoming request
my_datetime_local = my_datetime.astimezone(local_tz) # Use this method to change the timezone of already aware datetime objects
我不确定100%,但是我认为pytz中的方法get_localzone()
会检索您计算机的本地时区。我认为这不是您想要的。
最好使用djangos帮助器timezone
对时区感知日期时间对象进行所有修改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。