当用户在我们的应用程序中注册时,我们可以在我们针对国家数据库验证邮政编码时推断他们的邮政编码.从这个邮政编码确定他们的时区的潜在猜测的最佳方法是什么?
我们正在努力减少我们明确要求他们提供的数据量.如果我们的最佳猜测是错误的,他们将能够稍后手动设置时区.我发现邮政编码无助于搞清楚美国以外的时区,但在这种情况下我们不得不手动询问,而且无论如何我们主要与美国打交道.
我发现了很多邮政编码数据库,到目前为止只有少数包含时区信息,但那些不是免费的,比如这个.如果为了做到这一点而必须支付订阅服务,那么它就不值得了,我们只需要明确询问用户.
虽然语言不是特别相关,因为我可以转换所需的东西,但我们使用的是PHP和MySQL.
Dou*_*dek 37
我刚刚找到一个免费的zip数据库,其中包括时间偏移和参与夏令时.我喜欢Erik J的答案,因为它可以帮助我选择实际时区而不是偏移(因为你永远不能完全确定规则),但我想我可能会从这开始,并尝试根据偏移/ dst配置找到最佳时区匹配.我想我可能会尝试设置一个简单版本的Development 4.0的答案来检查我从zip信息中得到的作为一个完整性测试.这绝对不是我希望的那么简单,但组合应该让我至少90%确定用户的时区.
Eri*_* J. 24
大多数州都在一个时区(尽管有一些例外).大多数邮政编码不跨越州界(尽管有一些例外).
您可以通过组合这些事实快速找出每个zip的时区列表.
您可以使用此链接或Google地球查看邮政编码的边界并与时区地图进行比较,以将拉链映射到按时区线划分的州的时区.
您正在处理的大多数非美国国家可能只属于一个时区.您可能想要查看前N名非美国访客的来源,并查看他们的时区.
chr*_*riv 11
我创建了一个开源(MIT许可)MySQL数据库表,交叉引用邮政编码和时区,并将其上传到sourceforge.net:
http://sourceforge.net/projects/zip2timezone/files/
它来自四个地点(主要的Yahoo PlaceFinder API - 感谢@Chris N)
有关更多信息和说明,请参阅自述文件.
如果你愿意,你也可以通过询问浏览器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);
Run Code Online (Sandbox Code Playgroud)
您需要知道的第二件事是该位置是否遵守夏令时(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
}
Run Code Online (Sandbox Code Playgroud)
所有这一切归功于Josh Fraser.
这可能会帮助您在美国以外的客户,它可能会补充您的zip方法.
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"
}
Run Code Online (Sandbox Code Playgroud)
它们需要查询字符串上的unix时间戳.从返回的响应中可以看出,timeZoneName它基于时间戳考虑了夏令时,而timeZoneId时区则是与DST无关的名称.
对于我的使用,在Python中,我只是传递timestamp=0并使用该timeZoneId值tz_info从pytz获取对象,然后我可以使用它来在我自己的代码中本地化任何特定的日期时间.
我相信PHP同样你可以在http://pecl.php.net/package/timezonedb找到"America/New_York"