2013-02-02 49 views
17

我有一个存储在系统时间UTC的mysql DATETIME值。我需要将它转换为django中的本地时区。以下是我目前有:在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值是在我的本地时区=“美国/洛杉矶”?

+0

通过 “我的本地时区” 你的意思是时区服务器运行在或查看页面的客户端的时区? – Sergey

+0

我在'settings.py' ='America/Los_Angeles' – David542

回答

20

Django documentation for timezones记录了将datetime对象转换为适合显示的时区的所有必要细节。

您的数据存储在UTC,这是很好的。当您从数据库中获得DateTime字段对象时,它将是一个天真的datetime.datetime对象。即没有附加时区的日期/时间。然后由您来完成转换。

您的web应用程序的用户可能处于不同的时区,因此每个请求必须转换到相应的时区。这就是为什么有一个activate函数来设置当前时区。

如果你有pytz安装,你应该能够做到以下几点:

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

在模板引擎日期字段的所有输出将自动天真的日期时间对象转换你正确的时区显示。

如果您只有一个天真的datetime.datetime实例,您想要设置时区,则直接使用pytz模块。尽管在你的观点中这样做是不正常的,因为在演示时只转换时区是个好主意。

from pytz import timezone 

settingstime_zone = timezone(settings.TIME_ZONE) 
last_updated = last_updated.astimezone(settings_time_zone) 
+2

如果'last_updated'不在utc中,则将最后一行更改为:'last_updated_in_tz = tz.normalize(last_updated.astimezone(tz))'。如果'last_updated'是一个天真的日期时间对象,那么在调用'.astimezone()'之前让它知道:'aware_dt = naive_utc_dt.replace(tzinfo = pytz.utc)'(注意:'.replace()'仅适用于utc,否则使用'aware_dt = some_tz.localize(naive_dt,is_dst = None)'。 – jfs

+0

通过做“激活(settings.TIME_ZONE)”它发生的设置没有定义。我已经在settings.py上定义了我的TIME_ZONE ='UTC'。我想在哪里定义TIME_ZONE? – ePascoal

+1

@MrMartin您将需要按照https://docs.djangoproject.com/en/1.8/topics/settings/#using-settings-in-python-code –

2

我个人建议不要使用UTC以外的其他设置TIME_ZONE。我记得过去有过这个问题,不管是Django后端使用的数据库是否在不同的时区运行(将值保存在不同的时区)。这意味着要比较时间,根据你在做什么改变他们的时间很多麻烦。

一个好的做法是通常在后端使用一个时区(比如说UTC),并将前端的时间转换为您所服务的用户时区。

+0

中设置的时区我同意你的意见。我也遇到了其他时区的问题。但是,当我从浏览器发送日期时,它不会被转换为UTC,你能建议我一个正确的方法吗? – MegaBytes

+1

我需要更多关于如何从浏览器发送日期的信息(格式很重要,是否有以这种格式保存的时区信息)。如果日期是从浏览器发送的,则必须使用Django将其转换为UTC。我建议像https://labix.org/python-dateutil这样的库来执行此操作。 –

+0

感谢您的回复,现在问题解决了,但是我不知道它是否正确,因为我是Django&python的新手。目前我正在这样做。我从jQuery-datepicker中选择日期和时间,并使用Javascript转换为UTC时间,然后发送到服务器。我曾尝试使用pytz libs,但是在确定日期时间即将到来时遇到了一个问题。这是创建UTC转换问题。我不知道我是对还是错,请提出什么才是正确的做法。 – MegaBytes

5

我创建了一个简单的中间件来处理所有的这些东西对你:

https://github.com/Miserlou/django-easy-timezones

只需安装它,并按照指示,你就大功告成了!

  1. 安装Django-易时区

    pip install django-easy-timezones pytz pygeoip 
    
  2. 添加 “易时区” 到你的INSTALLED_APPS设置是这样的:

    INSTALLED_APPS = (
    ... 
    'easy-timezones', 
    ) 
    
  3. 添加EasyTimezoneMiddleware您MIDDLEWARE_CLASSES

    MIDDLEWARE_CLASSES = (
    ... 
    'easy-timezones.middleware.EasyTimezoneMiddleware', 
    ) 
    
  4. 添加到MaxMind GeoIP database的路径在你的设置文件:

    GEOIP_DATABASE = '/path/to/your/geoip/database/GeoIP.dat' 
    
  5. 启用你的模板本地时间。

    {% load tz %} 
        The UTC time is {{ object.date }} 
    {% localtime on %} 
        The local time is {{ object.date }} 
    {% endlocaltime %} 
    
  6. 田田!

+0

根据你的回答,我已经在我的django应用程序中设置了简单的时区,但是如果想从终端运行我的应用程序,我得到一个错误,说“没有名为easy_timezones的模块”,尽管我已经使用pip安装了该软件包。 @Rich Jones – RTan

+0

INSTALLED_APPS和MIDDLEWARE_CLASSES应该使用“easy_timezones”,而不是“easy-timezones” - 它在您的自述文件中是正确的,但不在此答案中。 – Spooner

+0

@Rich Jones如果我在前端使用DRF和angularJS,如何实现这一点?基本上我没有使用Django模板。在服务器端使用DRF,Postgres,Django1.8和在前端使用AngularJS/HTML。 – Amar

13

哭了很多之后,我可以让我的国家正确的日期做这样的事情:

>>> 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,但日期和时间是否正确显示。

UPDATE 30/10/2015(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>) 
2

我已经来到了同样的问题。在我的设置中,我设置了TIME_ZONE,但MySql中的时间仍然是UTC时间。

# settings.py 
TIME_ZONE = 'Asia/Shanghai' 

后来我发现,在settings.py,USE_TZ必须设置为False

USE_TZ = False

0

只需使用

timezone.localtime(arg)