1

解析のために日付オブジェクトを Python に送信する jQuery アプリがあります。問題は、Windows マシンで jQuery を使用しようとすると、日付オブジェクトが次のようになることです。

Tue Mar 12 2013 00:00:00 GMT-0600(Mountain Daylight Time)

私のMacでは、次のようになります。

Tue Mar 12 2013 00:00:00 GMT-0600(PST)

関数を使用して Python でこれらを解析しようとするとstrptime、最初 (MDT のもの) の最後にあるタイム ゾーンを理解できないため、失敗します。「不明な文字列形式」であると不平を言います。

これを解決するにはどうすればよいですか? 私は何か間違ったことをしていますか?

4

1 に答える 1

2

ここでの最善の解決策は、おそらく、jQueryコードを送信する前に日時を GMT に変換することです。(タイムゾーンも必要な場合は、個別に送信してください。)次に、Python側でJSON(または何でも)から取得し、 でGMTdatetimeオブジェクトに変換しstrptimeて使用できます。これで完了です。

しかし、コードの変更を最小限に抑えた最も簡単な解決策*は、jQuery に間違ったことをさせて、Python 側のタイムゾーンを破棄することです。基本的に、これの代わりに:

dt = datetime.datetime.strptime(jsondate)

これを行う:

dt = datetime.datetime.strptime(jsondate.partition('(')[0])

'('スティルの後にすべてを捨てると、-0600パーツが残ることに注意してください。「PST」または「山の夏時間」の部分が失われているだけです。

とにかく、それらの部分はあなたに何の役にも立ちませんでした。datetimeはこれらのタイムゾーン名を理解していません。そして、それがあったとしても、オフセット(すでに持っている)を除いて、それらをマップするものは何もありません。リアルタイムのタイムゾーンが必要な場合は、pytz.**のようなサードパーティ ライブラリが必要です。

その上、認識オブジェクトではなく、strptime明確にナイーブdatetimeオブジェクトを返します。したがって、タイムゾーンを解析して検索できたとしても、を解析し、タイムゾーンを取り出して個別に解析し、それを検索してから を呼び出さない限り、それらについてdatetimeは何も役に立ちません。datetimeastimezondatetime

つまり、要約すると、この情報を捨てる最悪のシナリオは、まさにあなたがすでに持っているものです。

余談ですが、3 つのプロジェクトを続けて、日時シリアライザーを Python 側の JSON エン/デコーダー (および JS 側の一致するシリアライザー) に具体的にプッシュしました。 UTC 日時 (ISO8601 形式。これはコンピューターにとってエポック秒と同じくらい使いやすく、人間にとって読み取り/編集がはるかに簡単なためです) とタイムゾーン オフセットを今日渡しますが、もしそうなら tzinfo キーに切り替えます。後で重要だから。3 回とも、それが重要になることはありませんでした…そして、それ重要だったプロジェクトでは、通常、ICAL スケジュールやグレゴリオ暦前の日付、またはその他の同様の楽しいことについて回っていました。

最後に、私のキャリアの中であまりにも多くの日付関連のコードを書いてきた者として、私はこれを言わなければなりません: 世界を乗っ取ることを計画している邪悪な大君主を知っているなら、彼らがタイムゾーンを廃止すると約束するなら、私は喜んで彼らのコードを見落とします。人類を奴隷にしたり、子猫を赤ちゃんと戦わせたり、ヘンチマンとして登録したりする他のプログラム。

* ... 少なくとも私にとっては最も単純です。なぜなら、Python は JS や jQuery よりもはるかによく知っているからです。:)

** IIRC は、pytz"Mountain Daylight Time" のような NT スタイルのタイムゾーン キーも処理できないため、実際にはそれを処理する別のライブラリが必要です。Microsoft の 3 つの類似した 1601 っぽいエポック時間 (2 つのまったく同じではないエポック、特別な「時間の終わり」の異なるルール) の違いを処理することを含め、あらゆる種類の MS 日時処理を行ったライブラリからそれを得たと思います。 " および "時間の開始" および "日付ではない" 値、…)。

于 2013-03-22T23:56:58.647 に答える