ABD posta kodunu saat dilimiyle eşleme [kapalı]


84

Kullanıcılar uygulamamıza kayıt olduklarında, onları ulusal bir veritabanına göre doğruladığımızda posta kodlarını çıkarabiliriz. Bu posta kodundan saat dilimlerine ilişkin iyi bir potansiyel tahmin belirlemenin en iyi yolu nedir?

Onlardan açıkça istememiz gereken veri miktarını en aza indirmeye çalışıyoruz. En iyi tahminimiz yanlışsa, daha sonra saat dilimini manuel olarak ayarlayabilecekler. Posta kodlarının ABD dışındaki saat dilimini belirlemede yardımcı olmayacağının farkındayım, ancak bu durumda yine de manuel olarak sormamız gerekir ve ne olursa olsun ağırlıklı olarak ABD ile ilgileniriz.

Ben posta kodu veritabanları bir sürü bulduk ve bugüne kadar sadece birkaç saat dilimi bilgilerini içeren, ama yapacak olanlar gibi ücretsiz değildir bu bir . Bunu yapmak için bir hizmete abonelik ödemek kesinlikle gerekliyse, buna değmez ve biz sadece kullanıcılara açıkça sormamız gerekir.

Muhtemelen ihtiyaç duyulan şeyleri dönüştürebildiğim için dil özellikle alakalı olmasa da PHP ve MySQL kullanıyoruz.


2
Tahminle ilgili soru için +1
Chris McCall

Yanıtlar:


37

DST'ye katılım ve zaman farkı içeren ücretsiz bir zip veritabanı buldum . Erik J'nin cevabını beğendim, çünkü sadece farkın aksine gerçek saat dilimini seçmeme yardımcı olacaktı (çünkü kurallardan asla tam olarak emin olamazsın), ama sanırım bununla başlayabilirim ve bunu denemesini sağlayabilirim. uzaklık / gd yapılandırmasına göre en iyi saat dilimi eşleşmesini bulun. Sanırım bir akıl sağlığı testi olarak zip bilgilerinden elde ettiklerimi kontrol etmek için Geliştirme 4.0'ın yanıtının basit bir sürümünü kurmaya çalışabilirim. Kesinlikle umduğum kadar basit değil, ancak bir kombinasyon beni bir kullanıcının saat diliminden en az% 90 emin sağlamalı.


@Doug: GeoCoding ile ilgili herhangi bir şey asla% 100 doğru olmayacak, dahası sadece ZIP seviyesinde hareket ettiğinizde. Yine de, zamanın% 90'ından fazlasında doğru olursanız, muhtemelen kullanıcılarınız için bir fayda olacaktır. En kötüsü bir saattir kapalı olman.
Eric J.

3
Dikkat edin, ücretsiz zip veritabanları, posta hizmeti bu dosyayı aylık olarak değiştirdiği için neredeyse her zaman kullanılmaz hale gelir. ayrıca bkz semaphorecorp.com/cgi/zip5.html
Joe snyder

Bu bağlantı bazı iyi noktaları ortaya çıkarıyor, ancak bunu sadece genel bölge hakkında bir tahmin yapmak için (ve düzeltmelere izin vermek için) kullandığım için çok fazla endişelenmeme gerek yok. Bir posta kodu birden fazla saat dilimini aşamazsa - ancak bu durumda, zaten uç bir durumdur ve kullanıcı adreslerini asla istemeyeceğimiz için, bunları daha fazla doğrulamak için kullanamayız. Ama aslında, işler yayınlanmadan önce, güncel kalmak için gerçekten abone olmamız bizim için yararlı olacaktır. Ücretsiz olan en azından test etmek için iyidir.
Doug Kavendek

2
@joesnyder Link bozuk, güncelleyebilir misiniz veya en azından orada ne olduğunu açıklayabilir misiniz?
dlsso


26

Çoğu eyalet tam olarak bir saat dilimindedir (birkaç istisna olsa da). Çoğu posta kodu eyalet sınırlarını aşmaz (birkaç istisna olsa da).

Bu gerçekleri birleştirerek hızla kendi saat dilimleri listenizi oluşturabilirsiniz.

İşte bir listesi devletin başına posta kodu aralıkları ve bir liste saat dilimine başına devletler .

Posta kodlarının sınırlarını görebilir ve bu bağlantıyı kullanarak saat dilimi haritasıyla veya bir saat dilimi çizgisine göre bölünmüş eyaletler için bölgeleri saat dilimlerine eşlemek için Google Earth ile karşılaştırabilirsiniz.

İlgilendiğiniz ABD dışındaki ülkelerin çoğu muhtemelen tam olarak bir saat dilimindedir (yine istisnalar vardır). İhtiyaçlarınıza bağlı olarak, ABD dışındaki en iyi N ziyaretçinizin nereden geldiğine ve saat dilimlerine bakmak isteyebilirsiniz.


1
Vay canına, istisnalar neler?
Hamish Grubijan

5
@Hamish: Wikipedia bağlantısında görebileceğiniz birden fazla zaman dilimindeki durumlar için istisnalar (saat dilimi başına durum). Meslektaşım biz konuşurken ve eyalet sınırlarını aşan birkaç ZIP ile karşılaştıkça ZIP'leri eyaletlerle eşleştiriyor. Bir örnek 42223.
Eric J.

2
Ayrıca bazı eyaletlerin ( sanırım sadece Arizona ve Hawaii ) gün ışığından yararlanma saatini gözlemlemediğini unutmayın.
Jon-Eric

1
ABD’nin kuzeybatısındaki eyaletler eyalet başına bir milyon ve bir posta koduna sahiptir; adil uyarı.
Qix - MONICA

1
Birkaç istisnadan çok daha fazlası. zamanemperature.com/tzus/indiana_time_zone.shtml
Chris

12

Posta kodlarını ve saat dilimlerini çapraz referans alan bir Açık Kaynak (MIT lisanslı) MySQL veritabanı tablosu oluşturdum ve sourceforge.net'e yükledim:

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

Dört konumdan elde edilir (birincil Yahoo PlaceFinder API - teşekkürler @Chris N)

Daha fazla bilgi ve talimat için BENİOKU dosyasına bakın.


Hala onu oluşturan koda sahip olma şansın var mı? Şimdi birkaç yaşında ve yeni bir veri kümesi almayı umuyorum.
billy

8

İsterseniz, tarayıcıya Josh Fraser'ın burada güzel bir yazı yazmasını isteyerek de saat dilimi hakkında fikir edinebilirsiniz

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);

Bilmeniz gereken ikinci şey, konumun gün ışığından yararlanma saatine (DST) uyup uymadığıdır. DST her zaman yaz aylarında gözlemlendiğinden, Ocak ayındaki iki tarih arasındaki saat farkını Haziran ayındaki iki tarih arasındaki zaman farkı ile karşılaştırabiliriz. Ofsetler farklıysa, konumun DST'yi gözlemlediğini biliyoruz. Ofsetler aynıysa, konumun DST'yi gözlemlemediğini biliyoruz.

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
}

Bunun için tüm kredi Josh Fraser'a gidiyor.

Bu, ABD dışındaki müşteriler için size yardımcı olabilir ve zip yaklaşımınızı tamamlayabilir.

İşte javascript'ten saat dilimini almaya değinen bir SO sorusu


1
Teşekkürler! Josh'un sitesinde bahsettiği gibi, Jon Nylander "daha sağlam bir çözüm yazdı. Bunun yerine onun sürümünü kullanın." Onun versiyonu burada: bitbucket.org/pellepim/jstimezonedetect
Brad Parks

6

Google'ın bunun için belirli bir API'si vardır: https://developers.google.com/maps/documentation/timezone/

örneğin: https://maps.googleapis.com/maps/api/timezone/json?location=40.704822,-74.0137431×tamp=0

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

Sorgu dizesinde bir unix zaman damgası gerektirirler. Döndürülen yanıttan timeZoneName, zaman damgasına göre gün ışığından yararlanma hesabını dikkate alırken timeZoneId, saat dilimi için DST'den bağımsız bir ad olduğu görülmektedir.

Kullanımım için, Python'da, değeri pytz'den bir nesne almak için aktarıyorumtimestamp=0 ve kullanıyorum, daha sonra bunu kendi kodumdaki herhangi bir belirli tarih- saati yerelleştirmek için kullanabilirim.timeZoneIdtz_info

PHP için benzer şekilde "America / New_York" u http://pecl.php.net/package/timezonedb'de bulabileceğinizi düşünüyorum.


4
Google'ın coğrafi kodlama API'sinin lisansının, sonuçları bir haritada görüntülemek için kullanmanızı gerektirdiğini unutmayın ...
Josh

@Josh O konumdaki saat dilimini belirlemek amacıyla bir konumu ele geçirmek için coğrafi kodlama API'sini kullanamayacağımı mı söylüyorsunuz?
Cruncher

2
Politika sayfasından: "Saat Dilimi API sonuçlarını bir Google Haritası üzerinde veya harita olmadan görüntüleyebilirsiniz. Saat Dilimi API sonuçlarını bir haritada görüntülemek istiyorsanız, bu sonuçların bir Google Haritası üzerinde görüntülenmesi gerekir. Google haritası olmayan bir haritada Saat Dilimi API verilerini kullanmak için. " developer.google.com/maps/documentation/timezone/policies
tmorell

4

: Saat dilimine dönüştürme posta koduna Yakut mücevher https://github.com/Katlean/TZip (çatallanmasının https://github.com/farski/TZip ).

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

Hızlıdır, küçüktür ve harici bağımlılıkları yoktur, ancak posta kodlarının saat dilimleriyle mükemmel bir şekilde eşleşmediğini unutmayın.


1
Hem orijinal TZip hem de Katlean'ın çatalı iyidir, ancak% 100 doğru değildir. Bazı posta kodları (muhtemelen son birkaç yılda kullanıma girmiştir) hesaba katılmaz.
bigtex777

1

Kendi sitem için bu sorun üzerinde çalışıyorum ve oldukça iyi bir çözüm bulduğumu hissediyorum

1) Yalnızca bir saat dilimine sahip tüm eyaletlere saat dilimleri atayın (çoğu durum)

ve sonra ya

2a) kalan durumlar için js çözümünü ( Javascript / PHP ve saat dilimleri ) kullanın

veya

2b) yukarıda @Doug ile bağlantılı olduğu gibi bir veritabanı kullanın.

Bu şekilde, kullanıcılarınızın çoğu için tz'yi ucuza (ve oldukça doğru bir şekilde!) Bulabilir ve ardından diğer eyaletlerde elde etmek için daha pahalı yöntemlerden birini kullanabilirsiniz.

Çok zarif değildi, ancak her kullanıcı için js veya veritabanı kullanmaktan daha iyi göründü bana.


1

Doug Kavendek cevabına ek olarak. Tz_database'e yaklaşmak için aşağıdaki yaklaşım kullanılabilir.

  1. İndir [Ücretsiz Posta Kodu Enlem ve Boylam Veritabanı]
  2. İndir [Dünyanın TZ saat dilimlerinin şekil dosyası]
  3. Şekil dosyası sorgulama için herhangi bir ücretsiz kitaplığı kullanın (örn. .NET Easy GIS .NET , LGPL).
    var shapeFile = new ShapeFile (shapeFilePath);
    var shapeIndex = shapeFile.GetShapeIndexContainingPoint (yeni PointD (uzun, enlem), 0D);
    var attrValues ​​= shapeFile.GetAttributeFieldValues ​​(shapeIndex);
    var timeZoneId = attrValues ​​[0];

PS Tüm bağlantıları ekleyemiyorum :( Bu yüzden lütfen aramayı kullanın.


1

Bu, tüm saat dilimlerini zip kodlarının bir dizisine eşleyecek bir yaml dosyası indirecektir:

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

Örneğin

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

Kısaltılmış saat dilimlerini tercih ederseniz, bunu çalıştırabilirsiniz:

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

Örneğin

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

1
Bu, Pasifik zamanındaki 96941'i (Mikronezya) içerir ve Pasifik saatinde posta kodu olarak 83500'ü içerir, ancak Amerika Birleşik Devletleri'nde var olduğuna inanmıyorum. Veriler nasıl oluşturuldu?
Justin Blank



0

Aslında bunun için harika bir Google API var. Bir konumu alır ve o konumun saat dilimini döndürür. Bir CSV dosyasındaki veya veritabanındaki her adres için sonuçları almak üzere bir bash veya python komut dosyası oluşturacak kadar basit olmalı ve ardından saat dilimi bilgilerini kaydedin.

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

Uç Nokta İste:

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

Tepki:

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

API'nin 1 bin aramalar için 5 $ olduğu unutulmamalıdır.
FlyingZebra1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.