Django models通過DateTimeField儲存到MySQL的時間的時區問題

來源:互聯網
上載者:User

標籤:des   style   blog   http   io   ar   color   使用   sp   

最近開始使用Django開發一些系統,在models.py中設定一些資料庫表結構並給日期時間字段賦初值,不過在使用的過程中,遇到一點問題。問題是,我本來伺服器使用的市區是“Asia/Shanghai”(+08:00),然後用datetime.now儲存到資料庫中時,裡面的時間總是比我的系統時間相差8小時(感覺是UTC時間),但是我也查看了MySQL資料庫中的時區是“+08:00”的(在MySQL中“SET GLOBAL time_zone = ‘+08:00′;”語句可以設定時區)。這到底是什麼原因呢?今天還花了不少時間來弄清楚這個問題。

我在models.py中定義的一個類如下(對於資料庫中一張表):

 

class TestSuite(models.Model):  id = models.AutoField(primary_key=True)  name = models.CharField(max_length=40, blank=True)  description = models.CharField(max_length=255, blank=True)  bu = models.CharField(max_length=40, blank=True)  is_enabled = models.BooleanField(default=True)  create_time = models.DateTimeField(default=datetime.now)  update_time = models.DateTimeField(default=datetime.now)

 

 


Django還有一些warning列印出來:/Users/jay/workspace/te/env/lib/python2.7/site-packages/django/db/models/fields/__init__.py:903: RuntimeWarning: DateTimeField TestSuite.update_time received a naive datetime (2014-06-15 14:38:37.873873) while time zone support is active. RuntimeWarning) 這裡的create_time和update_time存到資料庫中的時間總是UTC時區的時間(比北京時間慢了8個小時)。

這個warning的原因是,Django配置為使用timezone的datetime格式,而datetime.now是不包含timezone資訊的。

如果不需要在程式中特別處理時區(timezone-aware),在Django項目的settings.py檔案中,可以直接設定為“USE_TZ = False”就省心了。然後,在models.py中簡單的設定為“ create_time = models.DateTimeField(auto_now_add=True)”和“update_time = models.DateTimeField(auto_now=True)”。

如果還要保持USE_TZ=True,則可設定為“default=datetime.now().replace(tzinfo=utc)” 。

我還試圖去通過,django.utils.timezone.now()函數來擷取目前時間,我還以為settings.py中已經設定“TIME_ZONE = ‘Asia/Shanghai’”,就可以得到正確的時區和時間;可惜它依然得到的是UTC的時間,翻看它的實現就一下明白了,如下:

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()

 


還是試圖通過timezone來使用系統本地時間和時區,比如:default=timezone.localtime(timezone.now()) ,結果發現,也是不行的,存到MySQL中也是UTC時區的日期時間。得看下Django相應的實現代碼了,DateTimeField與MySQL資料庫互動的時候,是否都先轉換為UTC的時間再更新到資料庫的。另外,如果USE_TZ=True,那麼設定auto_now_add=True(或auto_now=True)可以達到我的目的嗎?答案也是否定的,翻看了一下Django對auto_now_add=True的處理就明白了,它就是對其賦值為 django.utils.timezone.now() 。

參考資料:

https://docs.djangoproject.com/en/1.4/ref/settings/#time-zone

https://docs.djangoproject.com/en/dev/topics/i18n/timezones/#usage

Django models通過DateTimeField儲存到MySQL的時間的時區問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.