1

現在、複数のサイトやサーバーをオンラインに移行し始めたときのために、すべての時刻を UTC で保存しています。

テンプレートでオブジェクトを文字列に変換するとき、およびユーザー入力を受け入れるdateときに問題が発生します。datetime6:00PM UTC は、PST にいる人にとってはあまり意味がありません。同様に、ユーザーに UTC で時刻を入力するように求めることは、災害を求めています。

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

4

5 に答える 5

1

クライアントがタイムゾーンを自己申告することに依存することの問題は、実際に取得するものがUTC オフセットである可能性が常にあることです (可能性の大きさについては議論の余地があります) 。UTC オフセットを取得すると、ロジックはほとんどの場合正常に機能しますが、実際には、クライアントによって生成された正確なタイムスタンプにのみ適用されます。過去または未来の時間は異なる UTC オフセットを持つ可能性があり、適切なタイム ゾーン データベースがないと予測できません。夏時間の境界近くで UTC オフセットを使用すると、壊滅的に間違った結果が生じる可能性があります。

それに加えて、識字能力のない一部のユーザー (おばあちゃんなど) は、ローカル システムのタイム ゾーンの設定方法を知らない場合があります。または、トンネル化されたセッションまたは仮想マシンのユーザーが、実際の設定に合わせて設定されていない「ローカル」タイム ゾーンを使用している可能性があります。

クライアントについて知っていること (IP など) に基づいてクライアントの政治的なタイム ゾーンを推測することは間違っている可能性があり、ユーザーが推測を無効にする方法がない場合は非常に煩わしい場合があります。しかし、匿名ユーザーまたは新規ユーザーのサインアップの場合、間違っている場合にユーザーに変更する方法を提供する限り、そのような方法を最初の推測として使用しても問題はないと思います。

私の推奨事項は具体的には次のとおりです。

  • ユーザー プロファイルの一部として Olson タイム ゾーンを含めます。タイム ゾーンは国ごとに調べることができます。これにより、ユーザーはタイム ゾーンを比較的簡単に選択できるようになります。まっすぐな UTC の選択を気にかけている 0.01% のユーザーにも :-)
  • IP ベースの推測でユーザー プロファイルの既定値を設定する場合、優れたルックアップ サービスを使用すれば、ほとんどの場合は正しくなります。ただし、間違っている場合はユーザーが変更できるようにします。
  • 匿名ユーザーの場合は、現地時間を表示または入力するページにある種のウィジェットを提供して、ユーザー プロファイルの場合とほぼ同じ方法で Olson タイム ゾーンを選択できるようにします。選択した値を Cookie に保存します。デフォルトは UTC または上記の推測値です。

ローカライズされた時間でタイムスタンプを表示する必要がある以前の Web ベースのアプリケーションを実装する際に、すべてのクライアントが過去および将来の日付について UTC を現地時間に正しく変換するわけではないことがわかりました。サーバー側ですべての変換を実行する必要がありました。これには、現地時間と Olson タイム ゾーンを取得し、UTC 時間を返す Web サービスが必要になる場合があります。

于 2011-11-11T19:43:28.777 に答える
1

私はこのようにしました。タイムゾーン オブジェクトの easy_install pytz が必要になる場合があります。

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 タイムスタンプとして格納しています。

于 2011-11-10T05:08:14.307 に答える
0

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

たとえば、サーバーに送信される UTC までの日付:

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

レンダリングのために、UTC を現地時間に変換します。

(new Date("October 17, 1986 15:29:13 UTC")).toLocaleString()
于 2011-11-10T07:03:35.090 に答える
0

リクエスト ヘッダーからユーザーのタイムゾーンを確実に取得することはできません。そのため、ほとんどの Web サイトでは、ユーザーにプロファイル設定でタイムゾーンを設定するよう求めています。ただし、さまざまなトリックを使用して取得を試みることができます。1 つのトリックは、Google の IP-to-location API を使用してユーザーがどこから来ているかを調べ、地理的な場所からタイムゾーンを推測しようとすることです。これも 100% 信頼できるわけではありませんが、真実に近づくことができます。

これはすでにここで少なくとも一度は尋ねられていることに気付きました: get user timezone

于 2011-11-10T04:43:03.530 に答える
0

私はIPジオロケーションをしません。特に無料のサービスでは、非常に不正確になる可能性があります。ユーザーに郵便番号または都道府県を尋ねて、それを Cookie に保存するだけです。

于 2011-11-10T04:57:15.100 に答える