2

Androidクライアント、Pythonサーバー、およびmysqlサーバー間で日時を渡す必要があります。

次のように機能するはずです。

  • androidクライアントはクライアントからcherrypypythonサーバーに正確な時刻を送信します(datetimeオブジェクトは文字列として送信する必要があると思いますか?)
  • サーバーは、この文字列を日時オブジェクトとして処理するのに役立つものに解析する必要があります

ここで2つのケースがあります。

  1. datetimeオブジェクトはmysqlデータベースに書き込む必要があります(関連するデータベーステーブルにDATETIMEタイプの属性があります)
  2. サーバーはmysqlデータベースから日時を取得し、それを解析された日時オブジェクトと比較する必要があります

一部のバックグラウンドプロセスがPython日時オブジェクトを入力パラメーターとして使用して作業を終了した後、新しい日時オブジェクトをAndroidクライアントに戻す必要があります

誰かがこれらの問題を解決するためのいくつかの良い解決策を知っていますか?

4

1 に答える 1

1

日時値を転送するための最適な形式は、ISO8601標準です。これらは、の形式YYYY-mm-ddTHH:MM:SS+tz:tzで提供されます。ここで、Tはオプションです。

Pythonのdatetime.datetimeクラスは、単純な追加モジュールを使用してこれらを解析できます(ISO 8601形式の日付を解析する方法を参照してください)。.isoformat()このメソッドを使用すると、出力も同じように簡単になります。

MySQLのDATETIME列タイプはUTC値のみを処理しますが、デフォルトではISO 8601日時文字列(の代わりにスペースを含むT)を受け入れるため、日時オブジェクトをUTCにキャストする必要があります(上記のiso8601モジュールの例)。

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

タイムゾーンオフセットもデータベースに挿入します。tzname()メソッドを使用してオブジェクトから取得datetimeし、関数を使用してMySQLからロードするときに再度解析しiso8601.iso8601.parse_timezone()ます。

# 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が日付と時刻をどれだけうまく処理できるかはわかりませんが、確かにISO8601形式を問題なく処理できます。

于 2012-09-11T15:29:33.997 に答える