在Django中获取本地时区

40 投票
11 回答
93002 浏览
提问于 2025-04-17 14:30

我有一个存储在系统时间(UTC)的mysql DATETIME 值。现在我需要把它转换成我本地的时区,在django中使用。以下是我目前的代码:

# value in mysql
`timestamp`
2013-02-01 22:48:45

# settings.py
TIME_ZONE = 'America/Los_Angeles'

# views.py
last_updated = PathLastUpdated.objects.all()[0].timestamp
print last_updated
2013-02-01 22:48:45 <-- same as UTC

我该怎么做才能把 last_updated 的值转换成我本地的时区,也就是“America/Los_Angeles”?

11 个回答

19

localtime 是一个模板过滤器,这可能会对你有帮助。

https://github.com/django/django/blob/1.8.4/django/utils/timezone.py#L298

代码示例:

from django.utils.timezone import localtime 

desired_datetime = localtime(stored_datetime)
36

经过很多次的尝试,我终于找到了一个能正确显示我国家日期的方法,像这样:

>>> from django.utils.timezone import get_current_timezone
>>> from front.models import Training

>>> tz = get_current_timezone()
>>> stored_date = Training.objects.first().start_date
datetime.datetime(2015, 4, 25, 17, 0, tzinfo=<UTC>)

>>> desired_date = stored_date + tz.utcoffset(stored_date)
datetime.datetime(2015, 4, 25, 14, 0, tzinfo=<UTC>)

这里的 tzinfo 属性显示的是UTC时间,但日期和时间显示是正确的。

更新于2015年10月30日(Django 1.8版本)

今天我使用了一种更适合Django的方法。

>>> from django.utils import timezone
>>> from trainings.models import Training
>>> value = Training.objects.first().date

>>> value
datetime.datetime(2015, 10, 23, 11, 32, 54, 633151, tzinfo=<UTC>)

>>> timezone.localtime(value)
datetime.datetime(2015, 10, 23, 9, 32, 54, 633151, tzinfo=<django.utils.timezone.LocalTimezone object at 0x7fa6129784a8>)
48

Django的时区文档详细说明了如何将datetime对象转换为适合显示的时区。

你的数据是以UTC(协调世界时)存储的,这样很好。当你从数据库中获取DateTime字段对象时,它会是一个没有时区信息的普通datetime.datetime对象。也就是说,它只是一个日期和时间,没有附带时区。接下来,你需要自己进行转换。

使用你网页应用的用户可能在不同的时区,所以每次请求时都必须进行适当的时区转换。这就是为什么有一个activate函数来设置当前的时区。

如果你安装了pytz,你应该可以这样做:

from django.utils.timezone import activate
activate(settings.TIME_ZONE)

这样,模板引擎中所有日期字段的输出都会自动将你的普通日期时间对象转换为正确的时区进行显示。

如果你只有一个单独的普通datetime.datetime实例想要设置时区,那么可以直接使用pytz模块。不过,在你的视图中这样做并不常见,因为最好是在展示的时候再进行时区转换。

from pytz import timezone

settings_time_zone = timezone(settings.TIME_ZONE)
last_updated = last_updated.astimezone(settings_time_zone)

撰写回答