미국 우편 번호를 시간대로 매핑 [닫힘]


84

사용자가 앱에 등록하면 국가 데이터베이스에 대해 유효성을 검사 할 때 우편 번호를 추론 할 수 있습니다. 이 우편 번호에서 시간대를 추측 할 수있는 가장 좋은 방법은 무엇입니까?

우리는 명시 적으로 요청해야하는 데이터의 양을 최소화하기 위해 노력하고 있습니다. 최선의 추측이 잘못된 경우 나중에 수동으로 시간대를 설정할 수 있습니다. 나는 우편 번호가 미국 이외의 시간대를 알아내는 데 도움이되지 않는다는 것을 알고 있지만,이 경우 어쨌든 수동으로 물어봐야 할 것이고 우리는 상관없이 주로 미국과 거래합니다.

많은 우편 번호 데이터베이스를 찾았고 지금까지 몇 개만 시간대 정보를 포함하고 있지만 무료가 아닌 것은 이것 처럼 . 이를 위해 서비스 구독료를 반드시 지불해야하는 경우에는 그만한 가치가 없으며 사용자에게 명시 적으로 요청해야합니다.

언어는 필요에 따라 변환 할 수 있으므로 특별히 관련이 없지만 PHP와 MySQL을 사용하고 있습니다.


2
추측에 대한 질문에 +1
Chris McCall

답변:


37

시간 오프셋과 DST 참여가 포함 된 무료 zip 데이터베이스 를 방금 찾았습니다 . 나는 Erik J의 대답을 좋아합니다. 오프셋이 아닌 실제 시간대를 선택하는 데 도움이 될 것이기 때문입니다 (규칙을 완전히 확신 할 수 없기 때문에). 오프셋 / dst 구성을 기반으로 최상의 시간대 일치를 찾습니다. 나는 온전한 테스트로 zip 정보에서 얻은 것을 확인하기 위해 Development 4.0의 답변의 간단한 버전을 설정하려고 할 수 있다고 생각합니다. 내가 바라는 것만 큼 간단하지는 않지만 조합을 통해 사용자의 시간대를 90 % 이상 확신 할 수 있습니다.


@Doug : GeoCoding과 관련된 모든 것은 결코 100 % 정확하지 않을 것입니다. 더구나 ZIP 수준에서만 행동 할 때 더욱 그렇습니다. 그래도 90 % 이상 정확할 수 있다면 사용자에게 도움이 될 것입니다. 당신이 떠날 가능성이 가장 나쁜 것은 한 시간입니다.
Eric J.

3
우편 서비스가 해당 파일을 매달 변경하기 때문에 무료 zip 데이터베이스는 거의 항상 쓸모가 없습니다. semaphorecorp.com/cgi/zip5.html
joe snyder 2010-06-25

이 링크는 몇 가지 좋은 점을 제시하지만, 일반적인 영역을 추측하고 수정을 허용하기 위해 이것을 사용하고 있기 때문에 너무 걱정할 필요가 없습니다. 우편 번호가 여러 시간대에 걸쳐있을 수있는 경우가 아니라면,이 경우 이미 예외적 인 경우이며 사용자의 주소를 절대 묻지 않기 때문에 더 이상 유효성을 검사하는 데 사용할 수 없습니다. 그러나 실제로 최신 상태를 유지하기 위해 실제로 시작하기 전에 실제로 구독하는 것이 유용 할 것입니다. 무료는 적어도 테스트에 적합합니다.
Doug Kavendek

2
@joesnyder 링크가 깨졌습니다. 업데이트하거나 적어도 거기에 무엇이 있었는지 설명해 주시겠습니까?
dlsso


26

대부분의 주가 정확히 하나의 시간대에 있습니다 (몇 가지 예외가 있음). 대부분의 우편 번호는 주 경계를 넘지 않습니다 (몇 가지 예외가 있지만).

이러한 사실을 결합하여 zip 당 시간대 목록을 빠르게 만들 수 있습니다.

다음 은 주별 우편 번호 범위 목록과 시간 대별 주 목록입니다 .

우편 번호의 경계를 확인 하고이 링크 또는 Google 어스를 사용하여 시간대지도와 비교하여 시간대별로 구분 된 주에 대한 시간대에 우편 번호 를 매핑 할 수 있습니다.

미국 이외 국가의 대부분은 아마도 정확히 하나의 시간대에있을 것입니다 (다시 말하지만 예외가 있습니다). 필요에 따라 미국 이외의 상위 N 명의 방문자가 어디에서 왔는지 확인하고 시간대 만 조회 할 수 있습니다.


1
와, 예외는 무엇입니까?
Hamish Grubijan 2010 년

5
@Hamish : Wikipedia 링크에서 볼 수있는 여러 시간대의 주에 대한 예외입니다 (시간 대별 주). 제 동료는 우리가 말할 때 ZIP을 주에 매핑하고 있으며 주 경계를 교차하는 몇 개의 ZIP을 발견했습니다. 한 예는 42223입니다.
Eric J.

2
또한 일부 주 (애리조나와 하와이 만 생각합니다 )는 일광 절약 시간을 준수하지 않습니다.
Jon-Eric

1
미국 북서부의 주에는 주당 1 백만 개의 우편 번호가 있습니다. 공정한 경고.
Qix-MONICA는

1
몇 가지 예외보다 훨씬 많습니다. time temperature.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 파일을 참조하십시오.


그것을 생성 한 코드를 아직 가지고 계신가요? 이제 몇 년이 지났고 새로운 데이터 세트를 얻고 싶습니다.
billy

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 월의 두 날짜 사이의 시간 오프셋을 6 월의 두 날짜 사이의 시간 오프셋과 비교할 수 있습니다. 오프셋이 다르면 위치가 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
}

이것에 대한 모든 크레딧은 Josh Fraser에게 있습니다.

이것은 미국 이외의 고객에게 도움이 될 수 있으며 우편 접근 방식을 보완 할 수 있습니다.

다음은 자바 스크립트에서 시간대를 얻는 방법에 대한 질문입니다.


1
감사! Josh가 자신의 사이트에서 언급했듯이 Jon Nylander는 "더 강력한 솔루션을 작성했습니다. 대신 자신의 버전을 사용하십시오." 그의 버전은 여기에 있습니다 : 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×tamp=0

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

쿼리 문자열에 유닉스 타임 스탬프가 필요합니다. 반환 된 응답 timeZoneName에서 타임 스탬프를 기준으로 일광 절약 시간을 고려한 것으로 보이지만 timeZoneId은 시간대에 대한 DST 독립적 인 이름입니다.

필자의 사용을 위해 Python에서는 값을 전달 timestamp=0하고 사용하여 pytz 에서 객체를 가져 오면 이를 사용하여 내 코드에서 특정 날짜 시간을 지역화 할 수 있습니다.timeZoneIdtz_info

PHP에서도 비슷하게 http://pecl.php.net/package/timezonedb 에서 "America / New_York"를 찾을 수 있다고 생각합니다 .


4
Google의 지오 코딩 API에 대한 라이센스를 사용하려면지도에 표시하기 위해 결과를 사용해야합니다 ...
Josh

@Josh 지오 코딩 API를 사용하여 해당 위치의 시간대를 결정할 목적으로 위치를 파악할 수 없다는 말입니까?
Cruncher

2
정책 페이지에서 : "Google지도에 또는지도없이 시간대 API 결과를 표시 할 수 있습니다.지도에 시간대 API 결과를 표시하려면 이러한 결과를 Google지도에 표시해야합니다. 금지됩니다. Google지도가 아닌지도에서 Time Zone API 데이터를 사용합니다. " developers.google.com/maps/documentation/timezone/policies
tmorell

4

우편 번호를 시간대로 변환하는 Ruby gem : https://github.com/Katlean/TZip ( https://github.com/farski/TZip 에서 분기 됨 ).

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

빠르고 작으며 외부 종속성이 없지만 우편 번호는 시간대에 완벽하게 매핑되지 않는다는 점에 유의하세요.


1
원래의 TZip과 Katlean의 포크는 모두 훌륭하지만 100 % 정확하지는 않습니다. 일부 우편 번호 (지난 몇 년 동안 도입되었을 가능성이 있음)는 고려되지 않습니다.
bigtex777

1

나는 내 사이트 에서이 문제를 해결하고 있으며 꽤 좋은 해결책을 찾은 것 같습니다.

1) 시간대가 하나만있는 모든 주에 시간대 할당 (대부분의 주)

다음 중 하나

2a) js 솔루션 ( Javascript / PHP 및 시간대) 사용 나머지 상태에 대해 ) 사용

또는

2b) @Doug가 위에 링크 한 것과 같은 데이터베이스를 사용하십시오.

이렇게하면 대부분의 사용자에 대해 tz를 저렴하고 (매우 정확하게!) 찾은 다음 다른 주에서 얻을 수있는 더 비싼 방법 중 하나를 사용할 수 있습니다.

매우 우아하지는 않지만 모든 사용자에게 js 또는 데이터베이스를 사용하는 것보다 나아 보였습니다.


1

Doug Kavendek 답변 외에도. 다음 접근 방식을 사용하여 tz_database에 더 가까이 다가 갈 수 있습니다.

  1. [무료 우편 번호 위도 및 경도 데이터베이스] 다운로드
  2. 다운로드 [세계 TZ 시간대의 shapefile]
  3. shapefile 쿼리를 위해 무료 라이브러리를 사용하십시오 (예 : .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...

1
여기에는 태평양 표준시로 96941 (마이크로 네시아)이 포함되고 태평양 표준시로 83500이 우편 번호로 포함되지만 미국에 존재한다고 생각하지 않습니다. 데이터는 어떻게 생성 되었습니까?
Justin Blank



0

실제로이를위한 훌륭한 Google API가 있습니다. 위치를 가져와 해당 위치의 시간대를 반환합니다. 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"
}

1k 호출에 대해 api는 $ 5입니다.
FlyingZebra1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.