Ánh xạ mã zip của Hoa Kỳ sang múi giờ [đã đóng]


84

Khi người dùng đăng ký với ứng dụng của chúng tôi, chúng tôi có thể suy ra mã zip của họ khi chúng tôi xác thực chúng dựa trên cơ sở dữ liệu quốc gia. Cách tốt nhất để xác định dự đoán tiềm năng tốt về múi giờ của họ từ mã zip này là gì?

Chúng tôi đang cố gắng giảm thiểu lượng dữ liệu mà chúng tôi phải yêu cầu họ một cách rõ ràng. Họ sẽ có thể đặt múi giờ theo cách thủ công sau đó nếu dự đoán tốt nhất của chúng tôi là sai. Tôi nhận ra rằng mã zip sẽ không giúp tìm ra múi giờ bên ngoài Hoa Kỳ, nhưng trong trường hợp đó, chúng tôi vẫn phải hỏi theo cách thủ công và chúng tôi chủ yếu giao dịch với Hoa Kỳ bất kể.

Tôi đã tìm thấy rất nhiều cơ sở dữ liệu mã zip và cho đến nay chỉ có một số chứa thông tin múi giờ, nhưng những cơ sở dữ liệu đó không miễn phí, chẳng hạn như cơ sở dữ liệu này . Nếu thực sự cần thiết phải trả tiền đăng ký một dịch vụ để thực hiện điều này, thì điều đó sẽ không đáng và chúng tôi sẽ phải hỏi người dùng một cách rõ ràng.

Mặc dù ngôn ngữ không liên quan đặc biệt vì tôi có thể chuyển đổi mọi thứ nếu cần, nhưng chúng tôi đang sử dụng PHP và MySQL.


2
1 cho câu hỏi về đoán
Chris McCall

Câu trả lời:


37

Tôi vừa tìm thấy một cơ sở dữ liệu zip miễn phí bao gồm thời gian bù đắp và sự tham gia vào DST. Tôi thích câu trả lời của Erik J, vì nó sẽ giúp tôi chọn múi giờ thực tế thay vì chỉ chênh lệch (vì bạn không bao giờ có thể hoàn toàn chắc chắn về các quy tắc), nhưng tôi nghĩ tôi có thể bắt đầu với điều này, và thử tìm múi giờ phù hợp nhất dựa trên cấu hình offset / dst. Tôi nghĩ rằng tôi có thể cố gắng thiết lập một phiên bản đơn giản của câu trả lời của Phát triển 4.0 để kiểm tra những gì tôi nhận được từ thông tin zip như một bài kiểm tra độ tỉnh táo. Nó chắc chắn không đơn giản như tôi mong muốn, nhưng sự kết hợp sẽ giúp tôi chắc chắn ít nhất 90% về múi giờ của người dùng.


@Doug: Bất cứ điều gì liên quan đến GeoCoding sẽ không bao giờ đúng 100%, hơn thế nữa khi bạn chỉ hành động ở cấp ZIP. Tuy nhiên, nếu bạn có thể chính xác hơn 90% thời gian, nó có thể sẽ mang lại lợi ích cho người dùng của bạn. Tệ nhất là bạn có thể phải nghỉ một giờ.
Eric J.

3
coi chừng, cơ sở dữ liệu zip miễn phí hầu như luôn lỗi thời, vì dịch vụ bưu chính thay đổi tệp đó hàng tháng. cũng xem semaphorecorp.com/cgi/zip5.html
joe snyder

Liên kết đó mang lại một số điểm tốt, nhưng vì tôi chỉ sử dụng điều này để đưa ra phỏng đoán ở khu vực chung (và cho phép sửa chữa), tôi không nên lo lắng quá nhiều. Trừ khi một mã zip có thể phân chia nhiều múi giờ - nhưng trong trường hợp đó, nó đã là một trường hợp tiên tiến và vì chúng tôi sẽ không bao giờ hỏi địa chỉ của người dùng nên chúng tôi sẽ không thể sử dụng chúng để xác thực thêm. Nhưng thực sự, có lẽ sẽ hữu ích cho chúng tôi nếu thực sự đăng ký một tài khoản trước khi mọi thứ đi vào hoạt động, để luôn cập nhật. Cái miễn phí ít nhất là tốt để thử nghiệm.
Doug Kavendek

2
@joesnyder Liên kết bị hỏng, bạn có thể cập nhật hoặc ít nhất là giải thích những gì ở đó không?
dlsso


26

Hầu hết các tiểu bang nằm trong chính xác một múi giờ (mặc dù có một vài ngoại lệ). Hầu hết các mã zip không vượt qua ranh giới tiểu bang (mặc dù có một vài ngoại lệ).

Bạn có thể nhanh chóng đưa ra danh sách múi giờ của riêng mình cho mỗi zip bằng cách kết hợp các dữ kiện đó.

Đây là danh sách các dải mã zip cho mỗi tiểu bang và danh sách các tiểu bang trên mỗi múi giờ .

Bạn có thể xem ranh giới của các mã zip và so sánh với bản đồ múi giờ bằng cách sử dụng liên kết này hoặc Google Earth, để lập bản đồ zip theo múi giờ cho các tiểu bang được phân chia bởi một đường múi giờ.

Phần lớn các quốc gia không thuộc Hoa Kỳ mà bạn đang giao dịch có thể nằm trong chính xác một múi giờ (một lần nữa, vẫn có ngoại lệ). Tùy thuộc vào nhu cầu của bạn, bạn có thể muốn xem N khách hàng không phải là người Hoa Kỳ đến từ đâu và chỉ cần tra cứu múi giờ của họ.


1
Chà, ngoại lệ là gì?
Hamish Grubijan

5
@Hamish: Các trường hợp ngoại lệ cho các tiểu bang trong nhiều múi giờ, bạn có thể xem trong liên kết Wikipedia (các tiểu bang trên mỗi múi giờ). Đồng nghiệp của tôi đang ánh xạ các ZIP tới các tiểu bang khi chúng tôi nói chuyện và bắt gặp một vài ZIP đi qua các đường tiểu bang. Một ví dụ là 42223.
Eric J.

2
Cũng lưu ý rằng một số bang (tôi nghĩ chỉ có Arizona và Hawaii ) không tuân theo giờ tiết kiệm ánh sáng ban ngày.
Jon-Eric

1
Các tiểu bang ở Tây Bắc của Hoa Kỳ có một triệu lẻ một mã vùng cho mỗi tiểu bang; cảnh báo đúng.
Qix - MONICA bị ngược đãi

1
Đó là nhiều hơn một vài trường hợp ngoại lệ. timetempentic.com/tzus/indiana_time_zone.shtml
Chris Moschini

12

Tôi đã tạo một bảng cơ sở dữ liệu MySQL nguồn mở (được MIT cấp phép) tham chiếu chéo các mã zip và múi giờ và tải nó lên sourceforge.net:

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

Nó có nguồn gốc từ bốn địa điểm (API Yahoo PlaceFinder chính - cảm ơn @Chris N)

Xem tệp README để biết thêm thông tin và hướng dẫn.


Bất kỳ cơ hội nào bạn vẫn có mã đã tạo ra điều đó? Nó đã được vài năm tuổi và tôi hy vọng sẽ có được một tập dữ liệu mới.
billy

8

Nếu muốn, bạn cũng có thể biết múi giờ bằng cách hỏi trình duyệt Josh Fraser có một bài viết hay về nó ở đây

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

Điều thứ hai mà bạn cần biết là vị trí đó có quan sát giờ tiết kiệm ánh sáng ban ngày (DST) hay không. Vì DST luôn được quan sát trong mùa hè, chúng tôi có thể so sánh khoảng thời gian chênh lệch giữa hai ngày trong tháng Giêng với khoảng thời gian chênh lệch giữa hai ngày trong tháng Sáu. Nếu hiệu số khác nhau, thì chúng ta biết rằng vị trí quan sát DST. Nếu các hiệu số giống nhau, thì chúng ta biết rằng vị trí KHÔNG quan sát 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
}

Tất cả tín dụng cho điều này thuộc về Josh Fraser.

Điều này có thể giúp bạn với những khách hàng bên ngoài Hoa Kỳ và nó có thể bổ sung cho cách tiếp cận zip của bạn.

Đây là một câu hỏi SO có liên quan đến việc lấy múi giờ từ javascript


1
cảm ơn! Như Josh đã đề cập trên trang web của mình, Jon Nylander đã "viết ra một giải pháp mạnh mẽ hơn. Hãy sử dụng phiên bản của anh ấy để thay thế". Phiên bản của ông là ở đây: bitbucket.org/pellepim/jstimezonedetect
Brad Parks

6

Google có một API cụ thể cho việc này: https://developers.google.com/maps/documentation/timezone/

ví dụ: 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"
}

Chúng yêu cầu dấu thời gian unix trên chuỗi truy vấn. Từ phản hồi được trả về, có vẻ như có timeZoneNametính đến tiết kiệm ánh sáng ban ngày, dựa trên dấu thời gian, trong khi đó timeZoneIdlà tên độc lập với DST cho múi giờ.

Đối với việc sử dụng của tôi, trong Python, tôi chỉ chuyển timestamp=0và sử dụng timeZoneIdgiá trị để lấy một tz_infođối tượng từ pytz , sau đó tôi có thể sử dụng giá trị đó để bản địa hóa bất kỳ ngày giờ cụ thể nào trong mã của riêng tôi.

Tôi tin rằng đối với PHP, bạn có thể tìm thấy "America / New_York" trong http://pecl.php.net/package/timezonedb


4
Lưu ý rằng việc cấp phép cho API mã hóa địa lý của Google yêu cầu bạn sử dụng kết quả để hiển thị trên bản đồ ...
Josh

@Josh Bạn đang nói rằng tôi không thể sử dụng API mã hóa địa lý để lấy một vị trí nhằm mục đích xác định múi giờ tại vị trí đó?
Cruncher

2
Từ trang chính sách: "Bạn có thể hiển thị kết quả API múi giờ trên Google Map hoặc không có bản đồ. Nếu bạn muốn hiển thị kết quả API múi giờ trên bản đồ, thì những kết quả này phải được hiển thị trên Google Map. Điều này bị cấm để sử dụng dữ liệu API múi giờ trên bản đồ không phải là bản đồ của Google. " developer.google.com/maps/documentation/timezone/policies
tmorell

4

Đá quý Ruby để chuyển đổi mã zip thành múi giờ: https://github.com/Katlean/TZip (được phân nhánh từ https://github.com/farski/TZip ).

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

Nó nhanh, nhỏ và không có phụ thuộc bên ngoài, nhưng hãy nhớ rằng mã zip không liên kết hoàn hảo với múi giờ.


1
Cả phuộc gốc của TZip và Katlean đều tốt, nhưng không chính xác 100%. Một số mã zip (có thể được giới thiệu trong vài năm gần đây) không được tính đến.
bigtex777

1

Tôi đang giải quyết vấn đề này cho trang web của mình và cảm thấy như tôi đã nghĩ ra một giải pháp khá tốt

1) Chỉ định múi giờ cho tất cả các tiểu bang chỉ có một múi giờ (hầu hết các tiểu bang)

và sau đó

2a) sử dụng giải pháp js ( Javascript / PHP và múi giờ ) cho các trạng thái còn lại

hoặc là

2b) sử dụng cơ sở dữ liệu như cơ sở dữ liệu được liên kết ở trên bởi @Doug.

Bằng cách này, bạn có thể tìm thấy tz rẻ (và có độ chính xác cao!) Cho phần lớn người dùng của bạn và sau đó sử dụng một trong các phương pháp khác, đắt hơn để lấy tz cho các tiểu bang còn lại.

Không phải là siêu thanh lịch, nhưng có vẻ tốt hơn với tôi so với việc sử dụng js hoặc một cơ sở dữ liệu cho mỗi và mọi người dùng.


1

Ngoài câu trả lời Doug Kavendek. Người ta có thể sử dụng cách tiếp cận sau để đến gần hơn với tz_database.

  1. Tải xuống [Cơ sở dữ liệu kinh độ và vĩ độ mã Zip miễn phí]
  2. Tải xuống [Một tệp hình dạng về các múi giờ TZ của thế giới]
  3. Sử dụng bất kỳ thư viện miễn phí nào để truy vấn tệp hình dạng (ví dụ: .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 Không thể chèn tất cả các liên kết :( Vì vậy, vui lòng sử dụng tìm kiếm.


1

Thao tác này sẽ tải xuống tệp yaml sẽ ánh xạ tất cả các múi giờ với một mảng mã zip của chúng:

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

ví dụ

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

Nếu bạn thích múi giờ rút ngắn, bạn có thể chạy cái này:

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

ví dụ

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

1
Điều này bao gồm 96941 (Micronesia) theo giờ Thái Bình Dương và bao gồm 83500 dưới dạng mã zip theo giờ Thái Bình Dương, nhưng tôi không tin rằng nó tồn tại ở Hoa Kỳ. Dữ liệu được tạo ra như thế nào?
Justin Blank



0

Thực sự có một API Google tuyệt vời cho việc này. Nó đến một vị trí và trả về múi giờ cho vị trí đó. Phải đủ đơn giản để tạo tập lệnh bash hoặc python để lấy kết quả cho từng địa chỉ trong tệp CSV hoặc cơ sở dữ liệu, sau đó lưu thông tin múi giờ.

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

Yêu cầu Điểm cuối:

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

Phản ứng:

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

cần lưu ý rằng api là $ 5 cho 1k cuộc gọi.
FlyingZebra1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.