web-dev-qa-db-ja.com

タイムゾーンへの米国の郵便番号のマッピング

ユーザーがアプリに登録すると、全国のデータベースに対してユーザーを検証するときに郵便番号を推測できます。この郵便番号からタイムゾーンの潜在的な推定値を決定する最良の方法は何でしょうか?

明示的に要求する必要があるデータの量を最小限にしようとしています。最良の推測が間違っている場合は、後でタイムゾーンを手動で設定できます。郵便番号は米国外のタイムゾーンを把握する助けにはなりませんが、その場合はとにかく手動で質問する必要があり、主に米国に関係なく対処します。

多くの郵便番号データベースを見つけましたが、これまでのところ、タイムゾーン情報が含まれているものはごくわずかですが、 this one など、無料のものはありません。これを行うためにサービスへのサブスクリプションを支払うことが絶対に必要な場合、それは価値がなく、ユーザーに明示的に尋ねるだけです。

おそらく必要なものを変換できるので、言語は特に関連していませんが、PHPとMySQLを使用しています。

79
Doug Kavendek

タイムオフセットとDSTへの参加を含む 無料のZipデータベース を見つけました。 Erik Jの答えが好きです、それはちょうどオフセットではなく実際のタイムゾーンを選択するのに役立ちます(ルールを完全に確信することは決してできないからです)が、私はこれから始めて、オフセット/ dst構成に基づいて、最適なタイムゾーンの一致を見つけます。健全性テストとしてZip情報から得られるものと照合するために、Development 4.0の回答の簡単なバージョンをセットアップしようとするかもしれないと思います。期待するほど単純ではありませんが、組み合わせによってユーザーのタイムゾーンが少なくとも90%確実にわかるはずです。

37
Doug Kavendek

ほとんどの州は正確に1つのタイムゾーンにあります(ただし、いくつかの例外があります)。ほとんどの郵便番号は州の境界を越えません(ただし、いくつかの例外があります)。

これらの事実を組み合わせることで、Zipごとにタイムゾーンの独自のリストをすばやく作成できます。

州ごとの郵便番号範囲 のリスト、および 時間帯ごとの状態 のリストです。

郵便番号の境界を確認し、 this link またはGoogle Earthを使用してタイムゾーンマップと比較し、タイムゾーンラインで分割された州のタイムゾーンにzipをマッピングできます。

対処している米国以外の国の大部分は、おそらく正確に1つのタイムゾーンにあります。米国以外の上位N人の訪問者がどこから来たのかを調べて、タイムゾーンを検索することができます。

24
Eric J.

郵便番号とタイムゾーンを相互参照するオープンソース(MITライセンス)MySQLデータベーステーブルを作成し、sourceforge.netにアップロードしました。

http://sourceforge.net/projects/Zip2timezone/files/

4つの場所から提供されます(プライマリYahoo PlaceFinder API-@Chris Nに感謝)

詳細と手順については、READMEファイルを参照してください。

11
chriv

必要に応じて、ブラウザにJosh Fraserの ここに素敵な記事を書いてください

var rightNow = new Date();
var jan1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);
var temp = jan1.toGMTString();
var jan2 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
var std_time_offset = (jan1 - jan2) / (1000 * 60 * 60);

2番目に知っておくべきことは、その場所が夏時間(DST)を遵守しているかどうかです。夏の間はDSTが常に観測されるため、1月の2つの日付間の時間オフセットを、6月の2つの日付間の時間オフセットと比較できます。オフセットが異なる場合、場所がDSTを遵守していることがわかります。オフセットが同じ場合、その場所はDSTを遵守していないことがわかります。

var june1 = new Date(rightNow.getFullYear(), 6, 1, 0, 0, 0, 0);
temp = june1.toGMTString();
var june2 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
var daylight_time_offset = (june1 - june2) / (1000 * 60 * 60);
var dst;
if (std_time_offset == daylight_time_offset) {
    dst = "0"; // daylight savings time is NOT observed
} else {
    dst = "1"; // daylight savings time is observed
}

これに対するすべての功績はジョシュ・フレイザーにあります。

これは、米国外の顧客に役立つ場合があり、Zipアプローチを補完する場合があります。

これはSO javascriptからタイムゾーンを取得することに関する質問

8
Development 4.0

Googleにはこれ専用のAPIがあります。 https://developers.google.com/maps/documentation/timezone/

例: https://maps.googleapis.com/maps/api/timezone/json?location=40.704822,-74.0137431&timestamp=

{
  dstOffset: 0,
  rawOffset: -18000,
  status: "OK",
  timeZoneId: "America/New_York",
  timeZoneName: "Eastern Standard Time"
}

クエリ文字列にUNIXタイムスタンプが必要です。返された応答から、timeZoneNameはタイムスタンプに基づいて夏時間を考慮に入れているように見えますが、timeZoneIdはタイムゾーンのDSTに依存しない名前です。

私の使用では、Pythonで、timestamp=0およびtimeZoneId値を使用してtz_info object from pytz 、それを使用して、独自のコードで特定の日時をローカライズできます。

PHP同様に http://pecl.php.net/package/timezonedb で「America/New_York」を見つけることができます

5
Anentropic

Zipコードをタイムゾーンに変換するRuby gem: https://github.com/Katlean/TZiphttps://github.com/farski/TZip から分岐).

> ActiveSupport::TimeZone.find_by_zipcode('90029')
 => "Pacific Time (US & Canada)"

高速で小さく、外部依存関係はありませんが、郵便番号はタイムゾーンに完全にはマッピングされないことに注意してください。

4
mkirk

私は最近 米国内のすべての郵便番号とその関連するタイムゾーンのRubyハッシュ =を作成しました。興味がある場合に使用できます。あなたの目的のために。

2
peterhurford

私は自分のサイトでこの問題に取り組んでおり、かなり良い解決策を思いついたと感じています

1)1つのタイムゾーン(ほとんどの状態)のみを持つすべての状態にタイムゾーンを割り当てます

そして次に

2a)残りの状態に対してjsソリューション( Javascript/PHP and timezones )を使用する

または

2b)@Dougによって上記でリンクされているようなデータベースを使用します。

この方法で、大部分のユーザーに対してtzを安価に(そして非常に正確に!)見つけ、それから他のより高価な方法の1つを使用して、残りの州でtzを取得できます。

非常にエレガントではありませんが、すべてのユーザーにjsまたはデータベースを使用するよりも良いように思えました。

1
Matt Parrilla

Zipgenius というzipcode-to-timezone APIを保守します。これは、上記の@chrivによって提供されるデータを使用します。必要に応じて自由に使用してください。

1
andrewhao
1
joe snyder

Doug Kavendekの回答に加えて。次のアプローチを使用して、tz_databaseに近づけることができます。

  1. ダウンロード[無料の郵便番号緯度経度データベース]
  2. ダウンロード[世界のTZタイムゾーンのシェープファイル]
  3. シェープファイルのクエリに無料のライブラリを使用します(例: 。NET Easy GIS .NET 、LGPL)。
 var shapeFile = new ShapeFile(shapeFilePath); 
 var shapeIndex = shapeFile.GetShapeIndexContainingPoint(new PointD(long、lat)、0D); 
 var attrValues = shapeFile.GetAttributeFieldValues(shapeIndex ); 
 var timeZoneId = attrValues [0]; 

追伸すべてのリンクを挿入できません:(だから検索を使用してください。

1

これにより、すべてのタイムゾーンを郵便番号の配列にマッピングするyamlファイルがダウンロードされます。

curl https://Gist.githubusercontent.com/anonymous/01bf19b21da3424f6418/raw/0d69a384f55c6f68244ddaa07e0c2272b44cb1de/timezones_to_zipcodes.yml > timezones_to_zipcodes.yml

例えば.

"Eastern Time (US & Canada)" => ["00100", "00101", "00102", "00103", "00104", ...]
"Central Time (US & Canada)" => ["35000", "35001", "35002", "35003", "35004", ...]
etc...

短縮されたタイムゾーンを希望する場合は、これを実行できます:

curl https://Gist.githubusercontent.com/anonymous/4e04970131ca82945080/raw/e85876daf39a823e54d17a79258b170d0a33dac0/timezones_to_zipcodes_short.yml > timezones_to_zipcodes.yml

例えば.

"EDT" => ["00100", "00101", "00102", "00103", "00104", ...]
"CDT" => ["35000", "35001", "35002", "35003", "35004", ...]
etc...
0
BananaNeil

これには実際に優れたGoogle APIがあります。場所を取得し、その場所のタイムゾーンを返します。 bashまたはpythonスクリプトを作成してCSVファイルまたはデータベース内の各アドレスの結果を取得し、タイムゾーン情報を保存するのに十分なほど単純でなければなりません。

https://developers.google.com/maps/documentation/timezone/start

要求エンドポイント:

https://maps.googleapis.com/maps/api/timezone/json?location=38.908133,-77.047119&timestamp=1458000000&key=YOUR_API_KEY

応答:

{
   "dstOffset" : 3600,
   "rawOffset" : -18000,
   "status" : "OK",
   "timeZoneId" : "America/New_York",
   "timeZoneName" : "Eastern Daylight Time"
}
0
Anonmily

また、Yahooジオコーディングサービスを使用している場合は、正しいフラグを設定してタイムゾーン情報を返すことができます。

http://developer.yahoo.com/geo/placefinder/guide/requests.html#flags-parameter

0
Chris N