【问题标题】:Python: Django comparing timezone.now() with DateTimeField ObjectPython:Django 比较 timezone.now() 和 DateTimeField 对象
【发布时间】:2020-11-22 00:18:01
【问题描述】:

我正在尝试验证日期是否不早于当前时间。所以我在论坛的某个地方读到我应该使用timezone.now() 而不是datetime.now()

Django 为您提供了一个时区感知的日期时间对象。日期时间.now() 给你一个时区天真的日期时间对象。你无法比较 这些。

改为使用 django.utils.timezone.now(),它提供了日期时间的类型

所以基本上作为 Django 开发人员,我应该更好地使用 Django 默认提供的功能。我在主设置文件中获得了这些设置:

TIME_ZONE = 'Europe/Vilnius'

USE_I18N = True

USE_L10N = True

USE_TZ = True

这是我验证提供的日期/时间的逻辑:

if date <= timezone.now():
    raise serializers.ValidationError("Meeting could not start earlier than the current time")
return date

但它总是返回日期对象而不是引发ValidationError。这些是我正在玩的时间:

if timezone.now() < parse(reservation['date_from']):
    raise serializers.ValidationError("Meeting could not start earlier than the current time")

!注意:我使用.parse() 将对象从str 转换为datetime 对象。

timezone.now() returns - 2020-11-22 00:16:55.334792+00:00
reservation['date_from'] returns - 2020-12-04T16:32:00+02:00 
reservation['date_from'] returns - 2020-12-04 16:32:00+02:00

【问题讨论】:

  • 第二个例子 reservation['date_from'] timezone.now() 所以验证通过了。也许你需要这样的翻转if parse(reservation['date_from']) &lt; timezone.now():
  • 我将 timezone.now() 更改为 timezone.localtime(timezone.now()) 以返回 UTC3,但仍然失败。
  • 2020-11-22 02:56:45.295127+02:00 - 服务器时间,请求时间 - 2020-11-22 04:40:00+02:00

标签: python django datetime


【解决方案1】:

为确保您比较的是同一时区的日期,最好将它们转换为同一时区。其实我更喜欢转换为UTC。当您使用.parse()(我假设来自 dateutil)时,生成的日期时间值(包括时区、偏移量等)取决于它所呈现的字符串。因此,您可以使用 .astimezone(pytz.utc) 将生成的日期时间转换为 UTC。由于django.utils.timezone.now() 以 UTC 格式返回当前时间,您可以直接比较它们。如需更多信息,您可以打印 parse(reservation['date_from']).astimezone(pytz.utc) 的结果以查看 UTC 的实际时间。

所以我会以这种方式提供使用比较:

if timezone.now() < parse(reservation['date_from']).astimezone(pytz.utc):
    raise serializers.ValidationError("Meeting could not start earlier than the current time")

【讨论】:

  • 嘿,如果timezone.localtime(timezone.now()) &gt; date,我已经完成了这个解决方案,但是等等,如何将提供的时间转换为服务器本地时区?
  • Django 提供了django.utils.timezone.get_current_timezone() 函数,它返回当前活动的时区,所以你可以使用.parse('...').astimezone(get_current_timezone()),而不是你应该比较timezone.localtime(timezone.now())
【解决方案2】:

在 Models.py 中使用它来自动设置日期:-

date_time = models.DateTimeField(auto_now_add=True)

【讨论】:

    猜你喜欢
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2012-10-07
    • 2011-11-14
    • 1970-01-01
    • 2013-11-01
    相关资源
    最近更新 更多