การจับคู่รหัสไปรษณีย์ของสหรัฐอเมริกากับเขตเวลา [ปิด]


84

เมื่อผู้ใช้ลงทะเบียนกับแอพของเราเราสามารถสรุปรหัสไปรษณีย์ของพวกเขาได้เมื่อเราตรวจสอบความถูกต้องกับฐานข้อมูลระดับประเทศ วิธีใดเป็นวิธีที่ดีที่สุดในการกำหนดเขตเวลาที่คาดเดาได้จากรหัสไปรษณีย์นี้

เรากำลังพยายามลดจำนวนข้อมูลที่เราต้องขออย่างชัดเจน พวกเขาจะสามารถตั้งค่าเขตเวลาด้วยตนเองได้ในภายหลังหากการคาดเดาที่ดีที่สุดของเราไม่ถูกต้อง ฉันตระหนักดีว่ารหัสไปรษณีย์จะไม่ช่วยในการหาเขตเวลานอกสหรัฐอเมริกา แต่ในกรณีนี้เราต้องถามด้วยตนเองอยู่ดีและเราจัดการกับสหรัฐอเมริกาเป็นส่วนใหญ่โดยไม่คำนึงถึง

ฉันได้พบมากของฐานข้อมูลรหัสไปรษณีย์และจนถึงขณะนี้มีเพียงไม่กี่มีข้อมูลโซนเวลา แต่ผู้ที่ทำไม่ได้ฟรีเช่นนี้ หากจำเป็นอย่างยิ่งที่จะต้องชำระค่าสมัครบริการเพื่อดำเนินการดังกล่าวจะไม่คุ้มค่าและเราจะต้องถามผู้ใช้อย่างชัดเจน

แม้ว่าภาษาจะไม่เกี่ยวข้องโดยเฉพาะเนื่องจากฉันสามารถแปลงสิ่งที่จำเป็นได้ แต่เราใช้ PHP และ MySQL


2
+1 สำหรับคำถามเกี่ยวกับการเดา
Chris McCall

คำตอบ:


37

ฉันเพิ่งพบฐานข้อมูล zip ฟรีที่มีการชดเชยเวลาและการมีส่วนร่วมใน DST ฉันชอบคำตอบของ Erik J เพราะมันจะช่วยให้ฉันเลือกเขตเวลาจริงได้ซึ่งตรงข้ามกับการชดเชยเพียงอย่างเดียว (เพราะคุณไม่สามารถมั่นใจในกฎได้อย่างสมบูรณ์) แต่ฉันคิดว่าฉันอาจเริ่มต้นด้วยสิ่งนี้และลองทำดู ค้นหาการจับคู่เขตเวลาที่ดีที่สุดตามการกำหนดค่า offset / dst ฉันคิดว่าฉันอาจลองตั้งค่าคำตอบของการพัฒนา 4.0 เวอร์ชันง่ายๆเพื่อตรวจสอบสิ่งที่ฉันได้รับจากข้อมูล zip เป็นการทดสอบความมีสติ แน่นอนว่ามันไม่ง่ายอย่างที่หวัง แต่การรวมกันควรทำให้ฉันแน่ใจอย่างน้อย 90% เกี่ยวกับเขตเวลาของผู้ใช้


@ Doug: สิ่งใดก็ตามที่เกี่ยวข้องกับ GeoCoding จะไม่ถูกต้อง 100% ยิ่งไปกว่านั้นเมื่อคุณดำเนินการในระดับ ZIP เท่านั้น ถึงกระนั้นหากคุณสามารถแก้ไขได้ 90% + ของเวลาอาจเป็นประโยชน์ต่อผู้ใช้ของคุณ แย่ที่สุดที่คุณจะออกไปคือหนึ่งชั่วโมง
Eric J.

3
ระวังฐานข้อมูล zip ฟรีมักจะล้าสมัยเนื่องจากบริการไปรษณีย์เปลี่ยนไฟล์นั้นทุกเดือน ดูsemaphorecorp.com/cgi/zip5.html ด้วย
joe snyder

ลิงก์นั้นแสดงจุดที่ดี แต่เนื่องจากฉันแค่ใช้สิ่งนี้เพื่อคาดเดาในพื้นที่ทั่วไป (และอนุญาตให้แก้ไข) ฉันจึงไม่ควรกังวลมากเกินไป เว้นแต่ว่ารหัสไปรษณีย์จะสามารถคร่อมเขตเวลาได้หลายเขต - แต่ในกรณีนั้นมันก็เป็นกรณีพิเศษอยู่แล้วและเนื่องจากเราจะไม่ขอที่อยู่ของผู้ใช้เราจึงไม่สามารถใช้รหัสเหล่านั้นเพื่อตรวจสอบความถูกต้องเพิ่มเติมได้ แต่จริงๆแล้วมันน่าจะเป็นประโยชน์สำหรับเราที่จะสมัครสมาชิกก่อนที่สิ่งต่างๆจะเผยแพร่เพื่อให้ทันสมัยอยู่เสมอ ฟรีอย่างน้อยก็ดีสำหรับการทดสอบ
Doug Kavendek

2
ลิงก์ @joesnyder เสียคุณช่วยอัปเดตหรืออย่างน้อยก็อธิบายว่ามีอะไรบ้าง?
dlsso


26

รัฐส่วนใหญ่อยู่ในเขตเวลาเดียว (แม้ว่าจะมีข้อยกเว้นบางประการ) รหัสไปรษณีย์ส่วนใหญ่ไม่ข้ามขอบเขตของรัฐ (แม้ว่าจะมีข้อยกเว้นบางประการ)

คุณสามารถสร้างรายการเขตเวลาของคุณเองได้อย่างรวดเร็วโดยการรวมข้อเท็จจริงเหล่านั้น

นี่คือรายการของช่วงรหัสไปรษณีย์ต่อรัฐและรายการของรัฐต่อโซนเวลา

คุณสามารถดูขอบเขตของรหัสไปรษณีย์และเปรียบเทียบกับแผนที่เขตเวลาโดยใช้ลิงก์นี้หรือ Google Earth เพื่อจับคู่รหัสไปรษณีย์กับเขตเวลาสำหรับรัฐที่แบ่งตามเส้นเขตเวลา

ประเทศที่ไม่ใช่สหรัฐอเมริกาส่วนใหญ่ที่คุณติดต่อด้วยอาจอยู่ในเขตเวลาเดียว (อีกครั้งมีข้อยกเว้น) ขึ้นอยู่กับความต้องการของคุณคุณอาจต้องการดูว่าผู้เข้าชมอันดับต้น ๆ ของคุณที่ไม่ใช่ชาวสหรัฐฯมาจากไหนและเพียงแค่ค้นหาเขตเวลา


1
ว้าวมีข้อยกเว้นอะไรบ้าง?
Hamish Grubijan

5
@ แฮมิช: ข้อยกเว้นสำหรับรัฐในหลายเขตเวลาที่คุณสามารถดูได้ในลิงค์ Wikipedia (รัฐต่อเขตเวลา) เพื่อนร่วมงานของฉันกำลังทำแผนที่ ZIP กับรัฐในขณะที่เราพูดและเจอ ZIP สองสามรายการที่ข้ามเส้นสถานะ ตัวอย่างหนึ่งคือ 42223
Eric J.

2
โปรดทราบว่าบางรัฐ (ฉันคิดว่าเฉพาะแอริโซนาและฮาวายเท่านั้น) ไม่ปฏิบัติตามเวลาออมแสง
Jon-Eric

1
รัฐทางตะวันตกเฉียงเหนือของสหรัฐอเมริกามีหนึ่งล้านรหัสไปรษณีย์ต่อรัฐ คำเตือนที่เป็นธรรม
Qix - MONICA ถูกหมอก

1
มันมากกว่าข้อยกเว้นบางประการ Timetemperature.com/tzus/indiana_time_zone.shtml
Chris Moschini

12

ฉันสร้างตารางฐานข้อมูล MySQL แบบโอเพนซอร์ส (ใบอนุญาต MIT) ที่อ้างอิงข้ามรหัสไปรษณีย์และเขตเวลาและอัปโหลดไปยัง sourceforge.net:

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

มีที่มาจากสี่แห่ง (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 มักจะสังเกตเห็นในช่วงฤดูร้อนเราจึงสามารถเปรียบเทียบการชดเชยเวลาระหว่างวันที่สองวันในเดือนมกราคมกับเวลาที่ชดเชยระหว่างวันที่สองวันในเดือนมิถุนายน หากการชดเชยแตกต่างกันเราจะรู้ว่าตำแหน่งนั้นสังเกต 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

ซึ่งอาจช่วยคุณในการติดต่อกับลูกค้านอกสหรัฐอเมริกาและอาจช่วยเสริมวิธีการซิป

นี่คือคำถาม SO ที่เกี่ยวข้องกับการรับเขตเวลาจากจาวาสคริปต์


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และใช้timeZoneIdค่าเพื่อรับtz_infoวัตถุจากpytzจากนั้นฉันสามารถใช้สิ่งนั้นเพื่อแปลวันเวลาใด ๆ ในรหัสของฉัน

ฉันเชื่อว่าสำหรับ PHP ในทำนองเดียวกันคุณสามารถค้นหา "America / New_York" ในhttp://pecl.php.net/package/timezonedb


4
โปรดทราบว่าการออกใบอนุญาตสำหรับ geocoding API ของ Google กำหนดให้คุณต้องใช้ผลลัพธ์เพื่อแสดงบนแผนที่ ...

@ Josh คุณกำลังบอกว่าฉันไม่สามารถใช้ geocoding API เพื่อคว้าตำแหน่งเพื่อจุดประสงค์ในการกำหนดเขตเวลาในสถานที่นั้นได้หรือไม่?
Cruncher

2
จากหน้านโยบาย: "คุณสามารถแสดงผลลัพธ์ Time Zone API บน Google Map หรือไม่มีแผนที่ก็ได้หากคุณต้องการแสดงผล Time Zone API บนแผนที่ผลลัพธ์เหล่านี้จะต้องแสดงบน Google Map ห้าม เพื่อใช้ข้อมูล Time Zone API บนแผนที่ที่ไม่ใช่ Google map " Developers.google.com/maps/documentation/timezone/policies
tmorell

4

อัญมณีทับทิมเพื่อแปลงรหัสไปรษณีย์เป็นเขตเวลา: 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 ของโลก]
  3. ใช้ไลบรารีฟรีสำหรับการสืบค้น shapefile (เช่น. NET Easy GIS .NET , LGPL)
    var shapeFile = ShapeFile ใหม่ (shapeFilePath);
    var shapeIndex = shapeFile.GetShapeIndexContainingPoint (PointD ใหม่ (ยาว, 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

โปรดทราบว่าหากคุณใช้บริการระบุพิกัดทางภูมิศาสตร์ของ Yahoo คุณสามารถส่งข้อมูลเขตเวลากลับมาให้คุณได้โดยตั้งค่าสถานะที่ถูกต้อง

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


อาจมีประโยชน์ในคราวเดียว แต่บริการ Geocoding ที่ยอดเยี่ยมของ Yahoo คือ EOL เมื่อหลายปีก่อน
lreeder

0

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

ควรสังเกตว่า api คือ $ 5 สำหรับการโทร 1k
FlyingZebra1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.