Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django时区是如何工作的?_Python_Django_Datetime_Timezone - Fatal编程技术网

Python Django时区是如何工作的?

Python Django时区是如何工作的?,python,django,datetime,timezone,Python,Django,Datetime,Timezone,因此,在我的设置中,我有以下内容: LANGUAGE_CODE = 'en-us' USE_I18N = True USE_L10N = True USE_TZ = True TIME_ZONE = 'Europe/Copenhagen' 然而,当我发布: timezone.now() datetime.datetime(2015, 9, 26, 8, 47, 15, 862729, tzinfo=<UTC>) timezone.now() datetime.dateti

因此,在我的设置中,我有以下内容:

LANGUAGE_CODE = 'en-us'

USE_I18N = True

USE_L10N = True

USE_TZ = True

TIME_ZONE = 'Europe/Copenhagen'
然而,当我发布:

timezone.now()
datetime.datetime(2015, 9, 26, 8, 47, 15, 862729, tzinfo=<UTC>)
timezone.now()
datetime.datetime(2015,9,26,8,47,15,862729,tzinfo=)
时间晚了两个小时

我正在阅读文档,我可以看到这个方法调用datetime.datetime(),其中的信息是正确的。我可以看到输出基于可变时区,该时区设置为我的当前位置。现在()不应该得到正确的时区时间吗

另一个问题:datetime.datetime()是否从服务器获取信息

  • 是的,它从运行代码的机器获取信息
  • 不,它不给你当地时间。不,它不使用您设置中的时区(,)。它使用UTC时间(
    Europe/Copenhagen
    为UTC+2)
  • 如果要获取本地datetime对象,应使其简单化:

    timezone.make_naive(timezone.now(), timezone.get_current_timezone())  
    

  • 关于时区感知日期时间,重要的不是它们恰好存储在哪个时区,而是它们代表单个时间点的事实。如果这是真的,那么在您想要的时区中显示datetime就很简单了(好吧,无论如何都有可能)

    因此,Django的工作方式是所有可感知的日期时间都存储在UTC中。(即使如此,它们也可能在UTC中从数据库返回,具体取决于数据库设置。)然后,它为您提供了工具(例如
    时区设置和
    设置)来设置在呈现模板供用户显示时应使用的时区


    所以你所描述的一切都是精心设计的。它真的会给您带来问题吗?

    我在models.py中添加了timezone.now,以便在某些类中标记修改时间。难道没有更好的方法吗?为什么建议使用简单的datetime对象?如果
    USE_TZ=True
    timezone.now().astimezone(timezone.get_current\u timezone())
    返回当前时区中的感知日期时间对象。尽管您不需要手动调用
    .astimezone()
    ;如果我在settings.py上设置时区,然后调用timezone.now(),它不应该返回正确的时间吗?正如我提到的,它返回一个时间对象,两个时间对象是您之前的。@E.Camilo:UTC的上午8点和欧洲/哥本哈根的上午10点(使用DST)在时间上完全相同。所以现在是正确的时间。
    TIME\u ZONE
    设置告诉Django用户显示的默认时区,它不影响Python对象中使用的时区。如果你真的想转换它,你可以(见#2),但这是一个不常见的用例。我想当我将时区设置为“欧洲/哥本哈根”时,时区参考将自动设置为UTC+2。这就是让我困惑的原因。