2011-11-10 15 views
1

私は現在、複数のサイトとサーバーをオンラインにするときに、作業を簡単にするために、すべての時間をUTCで保存しています。タイムゾーンとローカライゼーション

datedatetimeオブジェクトをテンプレート内の文字列に翻訳し、ユーザー入力を受け入れるときに問題が発生します。午後6時UTCは、PSTにいる誰かにたくさんのことを意味するものではありません。同様に、ユーザにUTCで時刻を入力するように頼むことは、災害を求めることです。

スマートでエラーのない方法でこれらの値を正しく変換するにはどうすればよいですか? HTTPリクエストからユーザーがどのタイムゾーンにいるかを判断する方法はありますか?できるだけ少ない労力でユーザーのタイムゾーンを判断する方法が本当に必要です。

答えて

1

自己にクライアントに頼るの問題点あなたの実際のところは、タイムゾーンの報道によると、実際に何を得るかは、のです。 UTCオフセットを取得した場合、ロジックはほとんどの場合うまく動作しますが、実際にはクライアントによって生成された正確なタイムスタンプにのみ適用されます。過去または将来の時間は、異なるUTCオフセットを持ち、適切なタイムゾーンデータベースなしでは予測できません。夏時間境界の近くでは、UTCオフセットを使用すると致命的に間違った結果が生じる可能性があります。

それ以外にも、読者以外のユーザー(つまりおばあちゃん)はローカルシステムのタイムゾーンの設定方法を知らない場合があります。またはトンネルセッションまたは仮想マシン上のユーザーが、実際の優先順位に設定されていない「ローカル」タイムゾーンを持つ可能性があります。

クライアント(IPなど)について知っていることに基づいてクライアントの政治的タイムゾーンを推測することは間違っている可能性があり、推測を無効にする方法がない場合はかなり迷惑になる可能性があります。しかし、匿名のユーザーや新しいユーザーのサインアップでは、間違った場合にユーザーに何らかの方法を教えてもらう限り、このような方法を最初の推測として使用することに何も問題はありません。

私の推薦は、特に次のようになります。

  • は、任意のユーザプロファイルの一部として、オルソンのタイムゾーンを含めます。タイムゾーンは国別に調べることができます。これにより、ユーザーは自分のタイムゾーンを比較的簡単に選択できます。
  • ユーザープロファイルのデフォルト値にIPベースの推測値を入力した場合は、使用するとほとんどの場合時間がかかるでしょう良いルックアップサービス。しかし、それが間違っている場合は、ユーザーが変更することができます。
  • 匿名ユーザーの場合は、ローカル時間を表示または入力する任意のページで、ユーザープロファイルとほぼ同じ方法でOlsonタイムゾーンを選択できるようなウィジェットを用意してください。選択した値をクッキーに保存します。上記のように、デフォルトはUTCまたは推測値になります。

ローカライズされた時刻にタイムスタンプを表示する必要があったWebベースのアプリケーションを実装する際に、すべてのクライアントがUTCを現地時間に正しく変換しているわけではありません。私はサーバー側ですべての変換を実行しなければならなかった。これにより、ローカル時間とOlsonタイムゾーンをとり、UTC時間を返すWebサービスが必要になる場合があります。

+0

おそらく私はここで間違った質問をしています。たぶん私は質問する必要があります: "StackExchangeはどのように日付変換を行うのですか?"私はサイトのどこにでも日付を入力する必要はありませんでした。日付は、サイトの一般ユーザーの場合でも、適切なタイムゾーンに表示されるようです。これは実際にはボンネットの下で複雑ですか?あなたの答えに何をすべきかを要約できますか? –

+0

まあ私は変数 't'でstackoverflow.comの' usr'クッキーを持っています。それを解読する方法はわかりませんが、私のタイムゾーンがクライアント側に格納されていればそれはおそらくそれです。私のデスクトップはUTCなので、このサイトが私に見せているすべての時間です。私は明示的にそのTZを設定するかどうか覚えていません。 – wberry

+0

私はちょうどログアウトし、私のデスクトップのタイムゾーンを変更し、サイトを訪問しました。私はUTC時代を見た。だから、それはクッキーに入っているか、私のブラウザは "ローカル"というアイデアを更新しなかったし、匿名のユーザーはいつもこのサイトでUTCを見る。 – wberry

0

要求ヘッダーからユーザーのタイムゾーンを確実に取得することはできません。そのため、ほとんどのWebサイトでは、ユーザーにプロファイル設定でタイムゾーンを設定するよう求めています。しかし、あなたは得るために様々なトリックを使用することができます。 1つのトリックは、GoogleのIP-to-Location APIを使用して、ユーザーがどこから来ているのかを特定し、その後、地理的位置からタイムゾーンを推測しようとします。これは100%信頼できるものではありませんが、あなたを真実に近づけるでしょう。

だけで実現し、これはすでに少なくとも一度ここに頼まれました:get user timezone

0

私はIPジオロケーションをしないだろう。それは非常に不正確なことがあり、特に無料のサービスです。ユーザーに郵便番号または州を尋ねて、それをクッキーに保管してください。

+0

アイルランドと他のいくつかの国には郵便番号がありません。私はいつでも郵便の詳細にわたって地理位置を取る。 –

1

私はこのようにしました。タイムゾーンオブジェクトのpytzをeasy_installする必要があるかもしれません。

import pytz 
import time 
import datetime 
d = time.time() 

print datetime.datetime.fromtimestamp(d, pytz.timezone('US/Eastern')) 
print datetime.datetime.fromtimestamp(d, pytz.timezone('US/Central')) 
print datetime.datetime.fromtimestamp(d, pytz.timezone('US/Mountain')) 
print datetime.datetime.fromtimestamp(d, pytz.timezone('US/Pacific')) 

ここで、変数dは、UTC時間をUNIXのタイムスタンプとして格納しています。

+0

これは、ユーザーがどのタイムゾーンを使用しているかを知るという問題を解決するものではありません。 –

+0

あなたは正しく、過去にサイトとサーバーを立ち上げて慎重に読んだわけではありません。 Webブラウザから時刻情報を取得するには、通常Javascriptを使用します。これは信頼されるべきではありませんが、ユーザーの現在のタイムゾーンを伝える標準のHTTP応答ヘッダーはありません。 – bigendian

+0

私の経験では、クライアントのために変換を実行するWebサービスは、最も信頼性の高いソリューションであり、あまり頭痛の種ではありません。サービスは要求の数を減らすために一度に複数の値を受け入れ/返す必要があります。 – wberry

0

javascript(現地時間を知る)を使用して、サーバーにデータを送信する前にユーザー入力時刻をUTCに変更できます。次に、UTCをUTCからローカルタイムに変換できるような形式でUTCを送信します。

は、例えば、UTCの日付がサーバーに送信される:現地時間に

(new Date("November 11, 2011 23:13:42")).toUTCString() 

そしてUTCを、レンダリングのために:

(new Date("October 17, 1986 15:29:13 UTC")).toLocaleString() 
+0

JavaScript VMでOlsonデータベースを使用できない場合や、Webサービスでローカリゼーションを実装している場合を除き、これは実行できません。 – wberry

+0

@wberry例を追加しました。あなたのブラウザはタイムゾーンが何であるかを知っています。私は問題がないと思います。 –

+0

多くのクライアント実装には欠陥があり、過去および将来の日付に対して夏時間/夏時間のポリシーが正しく適用されません。たとえば、夏時間が終了する前の日で、明日一定時間を入力すると、一部のクライアントではUTC時間が1時間オフになります。 Windows上のAdobe Flashがこれを行います。フロントエンドの作者として、これはあなたのせいではありませんが、それはあなたの問題です。 – wberry

関連する問題