将Django的日期和时间字段转换为当前时区的正确方法是什么?

3qpi33ja  于 2023-01-14  发布在  Go
关注(0)|答案(1)|浏览(122)

我觉得我忽略了一些明显的东西:
我使用SO解决方案here在Django应用中实现了时区,看起来效果不错(例如,当用户更改时区时,Django的{% get_current_timezone as TIME_ZONE %}timezone.get_current_timezone.now()会反映该更改)
然而,我有一个Django模型,它同时有一个简单的DateFieldTimeField输入,我定义了一个property来返回带日期和时间的格式化字符串,如下所示:

# imports
from django.db import models
import pytz
from django.utils import timezone
from django.template.defaultfilters import date as format_date
from django.template.defaultfilters import time as format_time

class MyModel(models.Model):

    date = models.DateField(default=timezone.now, null=True, blank=True)
    time = models.TimeField(default=timezone.now, null=True, blank=True)
   ...

@property
    def datetime(self):
        date_str = format_date(self.date, "j N Y")
        time_str = format_time(self.time, 'g:i a') 

        return f"{date_str} at {time_str}"

我如何使字符串中返回的日期和时间更改为适合时区?(可以假设它们当前引用的是UTC。)我目前正在尝试使用time字段。我尝试了以下两个函数来使时间感知:

  • pytz.utc.localize(self.time)
  • self.time.replace(tzinfo=pytz.UTC)

但是,每当我试图通过以下语句获取区域的后续时间时:

local_time = self.time.replace(tzinfo=pytz.UTC)

我得到错误:
"datetime. time"对象没有属性"astimezone"
编辑:我认为我应该一直使用的函数是

local_time = aware_time.astimezone(timezone.get_current_timezone())

但是同样的错误适用。

f0ofjuux

f0ofjuux1#

如果你想操作时区,你需要使用datetime对象。

from datetime import datetime
from datetime.timezone import utc

dt = datetime.combine(self.date, self.time, utc)

此时,您就有了一个可感知的datetime对象,可以将其转换为另一个时区,并将其打印出来等。

相关问题