在Django中获取本地系统时间

3

我有一个Django应用程序与其他遗留数据库密切交互。这些其他数据库都使用本地时间,而不是UTC。我了解Django的时区支持以及始终使用UTC时间的建议,除非与用户交互。在这种情况下,我只需要Django给我系统日期/时间。

在settings.py中,我有:

USE_TZ = False

当我在Linux命令行中运行date时,会得到如下输出(例如):

Tue Mar 15 17:03:42 MDT 2016

当我打开一个普通的(非Django)Python shell并运行以下命令时:

import datetime
str(datetime.datetime.now())

I get

'2016-03-15 17:04:55.182283'

但是当我在Django shell中运行相同的命令(python manage.py shell)时,我得到了一个早一个小时的时间:

'2016-03-15 16:07:10.949269'

有没有一种方法可以获取一个日期时间对象,它完全是系统时间,忽略任何其他时区设置?


也许我误解了你的问题,但是你不能只使用time.time()来获取系统时间吗? - Florent Chatterji
我认为我的系统时间使用不正确,抱歉。我的意思是当我的时区是下午5点时,普通的Python shell和系统命令“date”都告诉我现在是下午5点,但是在Django shell中,我得到的是下午4点。希望这有意义。 - user1309114
2个回答

11

你需要使用 django.utils.timezone,具体来说:

from django.utils.timezone import localtime, now

# get now datetime based upon django settings.py TZ_INFO
localtime(now())

我找到了另一种解决方法,但是只是为了遵循,这在我的情况下不起作用。如果我为Django打开USE_TZ,它可能会起作用,但是当我运行上面的代码时,我会得到:ValueError:astimezone()无法应用于naive datetime(“绕过此问题的另一种方法基本上是根本不依赖django应用程序提供的时间,没有找到让django给我正确时间的方法。”) - user1309114

1

来自django文档

如何与以本地时间存储日期时间的数据库交互?

在DATABASES设置中将TIME_ZONE选项设置为适当的时区,以便连接到不支持时区且未由Django管理的数据库。

这对于连接到不支持时区且未由Django管理的数据库非常有用。

设置USE_TZ=True,使django在内部使用时区感知的日期时间对象。

DATABASES设置中设置TIME_ZONE,以适应旧版数据库。 Django会自动将您的日期时间转换为适当的时区,例如,获取当前时间就足够了:

from django.utils import timezone

now = timezone.now()

注意:datetime.now() 返回一个无时区信息的日期时间对象。不要使用它。

1
我也尝试过这个,即使设置了正确的时区,我仍然得到比使用datetime.now()在非Django Python shell中得到的时间早一个小时的时间。在这种情况下,我真正想要的是一个naive datetime对象,我也很好奇为什么Django shell对datetime.now()(关闭USE_TZ)会有不同于常规Python shell的行为。 - user1309114
我需要补充一点 - 我不仅关心如何从传统数据库中正确添加/读取时间,还需要将该数据库中的条目与当前时间进行比较。例如,我需要从数据库中加载在最近十分钟内创建的对象。如果我无法获取与传统数据库时区匹配的日期时间对象,则无法编写可靠地为我提供最近X分钟内的对象的查询。 - user1309114
@user1309114:1- 你在数据库中得到了错误的时间吗?还是你只是打印了 timezone.now() 并认为它是错误的?2- 你不应该使用 datetime.now(),因此它的值是无关紧要的。3- 正如我之前所说:Django会自动转换你的时区感知的日期时间对象,例如,要获取过去X分钟:dt = timezone.now() - timedelta(minutes=X)。如果你将该值传递给数据库;它应该被转换为TIME_ZONE时区。 - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接