米国の郵便番号をタイムゾーンにマッピングする[終了]


84

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

私たちは、明示的に要求しなければならないデータの量を最小限に抑えようとしています。私たちの最善の推測が間違っている場合、彼らは後で手動でタイムゾーンを設定することができます。郵便番号は米国外のタイムゾーンを把握するのに役立たないことはわかっていますが、その場合はとにかく手動で問い合わせる必要があり、主に米国を扱います。

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

おそらく必要に応じて変換できるため、言語は特に関係ありませんが、PHPとMySQLを使用しています。


2
推測に関する質問の+ 1–
Chris McCall

回答:


37

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


@Doug:GeoCodingに関連するものは、100%正確になることはありません。ZIPレベルでのみ行動している場合はなおさらです。それでも、90%以上の確率で正解できれば、おそらくユーザーにとってはメリットになります。オフになる可能性が最も高いのは1時間です。
エリックJ.

3
郵便サービスはそのファイルを毎月変更するため、無料のzipデータベースはほとんどの場合廃止されています。semaphorecorp.com/cgi/zip5.html
joe snyder 2010年

そのリンクはいくつかの良い点をもたらしますが、私はこれを使用して一般的な領域を推測する(そして修正を可能にする)ので、あまり心配する必要はありません。郵便番号が複数のタイムゾーンにまたがることができない場合を除きますが、その場合、それはすでにエッジケースであり、ユーザーのアドレスを要求することは決してないため、それらを使用してさらに検証することはできません。しかし確かに、最新の状態に保つために、物事が稼働する前に実際にサブスクライブすることはおそらく私たちにとって有用でしょう。無料のものは、少なくともテストには適しています。
Doug Kavendek 2010年

2
@joesnyderリンクが壊れています、更新するか、少なくともそこにあったものを説明できますか?
dlsso


26

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

これらの事実を組み合わせることで、zipごとのタイムゾーンの独自のリストをすばやく思い付くことができます。

州ごと郵便番号範囲のリストと、タイムゾーンごとの州のリストを次に示します

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

あなたが扱っている米国以外の国の大多数は、おそらく正確に1つのタイムゾーンにあります(ここでも例外があります)。ニーズに応じて、米国以外の上位N人の訪問者がどこから来たのかを調べて、タイムゾーンを調べたい場合があります。


1
うわー、例外は何ですか?
Hamish Grubijan 2010年

5
@Hamish:ウィキペディアのリンクで確認できる複数のタイムゾーンの州の例外(タイムゾーンごとの州)。私の同僚は、私たちが話しているときにZIPを州にマッピングしていて、州の境界を越えるいくつかのZIPに出くわしました。一例は42223です。–
Eric J.

2
また、いくつかの州(アリゾナ州のみ&ハワイ、私はあることに注意してくださいと思う夏時間を観察していません)。
Jon-Eric

1
米国北西部の州には、州ごとに100万と1つの郵便番号があります。公正警告。
Qix-MONICAは2013年

1
それはいくつかの例外よりもはるかに多いです。timetemperature.com/tzus/indiana_time_zone.shtml
Chris Moschini 2014

12

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

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

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

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


それを生成したコードがまだある可能性はありますか?数年経ちましたが、新しいデータセットを取得したいと思っています。
ビリー

8

必要に応じて、ブラウザに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);

次に知っておく必要があるのは、その場所が夏時間(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アプローチを補完する可能性があります。

javascriptからタイムゾーンを取得することに触れるSOの質問があります


1
ありがとう!Joshが彼のサイトで言及しているように、JonNylanderは「より堅牢なソリューションを作成しました。代わりに彼のバージョンを使用してください」。彼のバージョンはここにあります:bitbucket.org/pellepim/jstimezonedetect
Brad Parks

6

Googleにはこのための特定のAPIがあります:https//developers.google.com/maps/documentation/timezone/

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

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

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

私が使用する場合、Pythonではtimestamp=0timeZoneId値を渡してpytztz_infoからオブジェクトを取得するだけで、それを使用して自分のコードで特定の日時をローカライズできます。

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


4
GoogleのジオコーディングAPIのライセンスでは、結果を使用して地図に表示する必要があることに注意してください...
Josh

@JoshジオコーディングAPIを使用して、その場所のタイムゾーンを決定する目的で場所を取得することはできないと言っていますか?
ランチャー2018

2
ポリシーページから:「タイムゾーンAPIの結果は、Googleマップに表示することも、マップなしで表示することもできます。タイムゾーンAPIの結果をマップに表示する場合は、これらの結果をGoogleマップに表示する必要があります。禁止されています。 GoogleマップではないマップでタイムゾーンAPIデータを使用するため。」 developers.google.com/maps/documentation/timezone/policies
tmorell

4

郵便番号をタイムゾーンに変換するRubygem:https//github.com/Katlean/TZiphttps://github.com/farski/TZipからフォーク)。

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

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


1
オリジナルのTZipとKatleanのフォークはどちらも優れていますが、100%正確ではありません。一部の郵便番号(過去数年間に導入された可能性が高い)は考慮されていません。
bigtex777 2016年

1

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

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

そしてどちらか

2a)残りの状態にはjsソリューション(Javascript / PHPおよびタイムゾーン)を使用します

または

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

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

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


1

ダグカベンデックの答えに加えて。次のアプローチを使用して、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];

PSすべてのリンクを挿入することはできません:(したがって、検索を使用してください。


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...

1
これには、太平洋時間の96941(ミクロネシア)と太平洋時間の郵便番号83500が含まれますが、米国には存在しないと思います。データはどのように作成されましたか?
ジャスティンブランク



0

実際、これには優れたGoogleAPIがあります。場所を取得し、その場所のタイムゾーンを返します。CSVファイルまたはデータベースの各アドレスの結果を取得してタイムゾーン情報を保存するbashまたはpythonスクリプトを作成するのに十分シンプルである必要があります。

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"
}

APIは1,000回の呼び出しで5ドルであることに注意してください。
FlyingZebra 15
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.