2012-09-11 34 views
2

我需要在android客戶端,python服務器和mysql服務器之間傳遞日期時間。Android Python MySQL日期時間分析

它應該工作如下:

  • Android客戶端發送的確切時間從客戶機到CherryPy的蟒蛇服務器(我猜DateTime對象應作爲一個字符串發送?)
  • 服務器有這個字符串解析成有用的東西,共同爲DateTime對象

現在有兩個情況:

  1. 日期時間對象應該被寫入到一個MySQL數據庫(沒有在相關的數據庫表型DATETIME的屬性)
  2. 服務器應該從MySQL數據庫中檢索日期時間,並將其與所解析的日期時間對象比較

後一些後臺進程完成了他們的使用Python datetime對象作爲輸入參數的工作,一個新的datetime對象應該被傳遞迴Android客戶端

有誰知道解決這些問題的一些好的解決方案?

+0

時區是否會涉及? –

+0

是的。該應用程序旨在支持多種語言,因此不同的時區。 – eff8691

回答

1

傳輸日期時間值的最佳格式是ISO 8601 standard;它們的格式爲YYYY-mm-ddTHH:MM:SS+tz:tz,其中T是可選的。

Python的datetime.datetime類可以通過一個簡單的額外模塊來解析這些模塊(請參閱How to parse an ISO 8601-formatted date?)。輸出與.isoformat() method一樣簡單。

MySQL的DATETIME列類型只處理UTC值,但默認情況下接受ISO 8601日期時間字符串(空間而不是T),因此您必須將日期時間對象轉換爲UTC(提到iso8601模塊的示例以上):

import iso8601 
utciso8601 = dt.astimezone(iso8601.iso8601.UTC).isoformat(' ')[:19] 

我會在數據庫中插入時區偏移量;只需使用tzname() methoddatetime對象中檢索它,然後在使用iso8601.iso8601.parse_timezone()函數從MySQL加載時再解析它。

# insertion: 
cursor.execute('INSERT INTO dates VALUES(?, ?)', utciso8601, dt.tzname()) 

# querying 
for row in query: 
    timezone = iso8601.iso8601.parse_timezone(row[1]) 
    utcdt = iso8601.parse_date(row[0]) 
    dt = utcdt.astimezone(timezone) 

我不知道Android如何處理日期和時間,但它確實可以處理ISO 8601格式。

+0

感謝您的回答。要根據android應用程序中的datetime對象使用對象,必須使用java.util包中的類(也就是說,您可以使用Java SDK中的所有內容來安裝android應用程序)。現在我在GregorianCalendar對象的幫助下獲取實際的日期時間。 – eff8691