【问题标题】:Django - How can I set manually DateTimeField value given date and time?Django - 如何在给定日期和时间的情况下手动设置 DateTimeField 值?
【发布时间】:2019-01-05 21:53:23
【问题描述】:

如何在给定日期和时间的情况下手动设置 DateTimeField 值?

这是我的模型,我正在尝试将日期和时间值分配给“created_at”字段:

class Attendance(models.Model):
    employee = models.ForeignKey(Employee)
    company = models.ForeignKey(Company)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
​
    def __str__(self):
        return self.employee.username
​

这是我在控制台中尝试过的:​ ​

> o = Attendance.objects.last()
> o.updated_at
datetime.datetime(2018, 6, 26, 0, 45, 31, 829827, tzinfo=<UTC>)
> x = datetime.strptime('17/07/2018 12:20', '%d/%m/%Y %H:%M')
> x
datetime.datetime(2018, 7, 17, 12, 20)
>o.updated_at = x
o.save()
>z = Attendance.objects.last()
>z.updated_at
datetime.datetime(2018, 7, 29, 12, 0, 13, 204815, tzinfo=<UTC>)

请注意,我设置了“2018,7,17​​”,但它显示为“2018,7,29”。作业正确吗?可能它也需要时区。

【问题讨论】:

  • 你确定o和z是同一个对象吗?此代码似乎正确,但可能是更改/保存对象会使不同的对象响应“Attendance.objects.last()”。
  • 是的,在我的本地机器上开发中是一样的。有人告诉我 auto_now_add 可能是个问题,应该改用默认值
  • 您意识到您的 auto_now 可能正在工作并覆盖您的 updated_at 字段,对吗?由于您正在更新 updated_at 字段并获得今天的结果,因此根据应用 auto_now 的时间,您似乎获得了两个可能正确的结果之一。
  • 哦,没意识到,因为我不想接触 created_at,所以正在测试 updated_at
  • 也许你可以添加一个额外的字段来检查 updated_at ..... 对我来说,你的代码看起来像写的那样工作。

标签: python django datetime django-queryset


【解决方案1】:

如果USE_TZTrue,则datetimes 将是always be stored in UTC

解决此问题的唯一方法是将USE_TZ 设置为Falseauto_nowuses django.utils.timezone.now(),其中is defined to do如下:

如果USE_TZFalse,这将是一个简单的日期时间(即没有关联时区的日期时间),它表示系统本地时区的当前时间。

转换时间并将其存储在数据库中不是一个好方法,因此,在需要时转换时间

【讨论】:

    【解决方案2】:

    因此,如果您尝试将 updated_at 字段设置为当前的 Asia/Kuala_Lumpur 时区,您希望生成 datetime.datetime(2018, 7, 29, 12, 0, 13, 204815, tzinfo =) 具有适当的 tzinfo 值。

    这是以下两个 Stack Overflow 答案的组合:

    Python strptime() and timezones?

    Is there a list of Pytz Timezones?

    您的结果调用将引用

    Asia/Kuala_Lumpur
    

    调用可能如下所示:

    x = datetime.tzinfo("Asia/Kuala_Lumpur")
    y = datetime.datetime(2018, 7, 29, 12, 0, 13, 204815, x)
    

    【讨论】:

    • 它不起作用。它有这个错误 TypeError: tzinfo argument must be None or of a tzinfo subclass, not type 'str'。也许它应该像这样工作?不确定。我用“US/Pacific”尝试了你的代码
    • 在控制台中使用了一点,我认为这可以解决您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多