【问题标题】:django 1.4 timezone.now() vs datetime.datetime.now()django 1.4 timezone.now() 与 datetime.datetime.now()
【发布时间】:2012-06-02 18:35:14
【问题描述】:

我对夏令时处理有点困惑

settings.py:

TIME_ZONE = 'Europe/London'
USE_TZ = True

在 django 外壳中:

>>> from django.utils import timezone
>>> import datetime
>>> print timezone.now()
2012-05-28 11:19:42.897000+00:00
>>> print timezone.make_aware(datetime.datetime.now(),timezone.get_default_timez
one())
2012-05-28 12:20:03.224000+01:00

为什么它们在夏令时方面不一样?两者都应该知道语言环境,不是吗?

我已经阅读了文档,但并不明智。

【问题讨论】:

    标签: django timezone


    【解决方案1】:

    根据timezone.now()source

    def now():
        """
        Returns an aware or naive datetime.datetime, depending on settings.USE_TZ.
        """
        if settings.USE_TZ:
            # timeit shows that datetime.now(tz=utc) is 24% slower
            return datetime.utcnow().replace(tzinfo=utc)
        else:
            return datetime.now()
    

    它基于utc 而不是您的默认时区。您可以通过使用实现相同的价值

    now = timezone.make_aware(datetime.datetime.now(),timezone.get_default_timezone())
    print now.astimezone(timezone.utc)
    

    【讨论】:

    • 这有点违反直觉。我以为 timezone.now() 现在会在默认时区给我!在我看来不是很pythonic。使用 .astimezone() 解决了我的问题,谢谢。
    • 为什么我在执行以下操作时总是报错: >>> import datetime >>> from django.utils import timezone >>> from polls.models import Question >>> # create a pub_date 未来 30 天的问题实例 >>> future_question = Question(pub_date=timezone.now() + datetime.timedelta(days=30)) >>> # 它是最近发布的吗? >>> future_question.was_published_recently() True
    • >>> future_question.was_published_recently() Traceback(最近一次调用最后):文件“”,第 1 行,在 文件“C:\Users\michmar3\workspace\pollsite \polls\models.py",第 17 行,在 was_p ublished_recently 中返回 self.pub_date >= datetime.datetime.now() - datetime.timedelta(days=1) 文件“C:\jython2.7b2\Lib\datetime.py ",第 1727 行,在 ge 中 return self.__cmp(other) >= 0 文件 "C:\jython2.7b2\Lib\datetime.py",第 1765 行,在 _datetime__cmp raise TypeError("cannot比较天真和有意识的日期时间”)类型错误:无法比较天真和有意识的日期时间
    • @pitchblack408 检查this。在was_published_recently 中尝试timezone.now() 而不是datetime.datetime.now()
    • @meepmeep 这确实违反直觉。第一眼看去。在第二种情况下,您可能会意识到发生这种情况是因为 Django 将时间保持在 UTC 中,直到它必须将其呈现给用户。这就是转换发生的地方。模板标签如nowdoes这个automatically
    【解决方案2】:

    从 Django 1.11 开始,您可以简单地调用 django.utils.timezone.localtime 来获取默认时区的 datetime

    >>> from django.utils import timezone
    >>> timezone.localtime()
    

    来自文档:

    将感知的日期时间转换为不同的时区,默认为当前时区。

    省略值时,默认为now()

    此功能不适用于原始日期时间;请改用make_aware()

    【讨论】:

    • 返回 2019 年 5 月 24 日下午 1:14。根据 windows 的时间是下午 3:14
    【解决方案3】:

    您可以将参数传递给datetime.datetime.now()

    import pytz, datetime
    utc = pytz.utc
    utc_now = datetime.datetime.now(tz=utc)
    

    或者使用timezone,啦啦:

    from django.utils import timezone
    
    now = timezone.now()
    

    https://docs.djangoproject.com/en/2.1/topics/i18n/timezones/

    【讨论】:

      【解决方案4】:
      from datetime import datetime
      from django.utils import timezone
      
      def now():
          try:
              return timezone.localtime(timezone.now()).strftime('%Y-%m-%dT%H:%M:%S')
      
          except Exception as exp:
              print('TimeZone is not set - {}'.format(exp))
              return datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
      

      如果您在 Django 设置中设置了 TIME_ZONE = 'Europe/London'USE_TZ = True,您将放置在 try 部分中,否则,将放置在 except 部分中。


      [注意]:

      • .strftime() 是一个选项

      【讨论】:

        【解决方案5】:
        from datetime import datetime
        from pytz import timezone
        
        # one can get any time for respective timezone
        current_time = datetime.now(timezone('Asia/Kolkata'))
        print("time in india :", current_time)
        

        【讨论】:

          猜你喜欢
          • 2015-01-13
          • 2021-01-29
          • 1970-01-01
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          • 2021-10-18
          相关资源
          最近更新 更多