如何使用纬度和经度坐标从一个位置获取时区?

StackOverflow关于parsing某个位置的时区有太多的问题。 这个社区维基是试图巩固所有有效的回应。

请更新我的答案,或者根据需要添加自己的答案。

问题
考虑到一个位置的经纬度,如何知道该位置的哪个时区是有效的?

在大多数情况下,我们正在寻找IANA / Olson时区标识,尽pipe一些服务可能只返回UTC偏移量或其他时区标识。 请阅读时区标签信息了解详细信息。

时区位置Web服务

  • Google时区API
  • GeoNames时区API
  • TimeZoneDB API
  • AskGeo – 商业(但可以说比GeoNames更准确 )
  • GeoGarage时区API – 商业,侧重于航海时区。

原始时区边界数据

  • 时区边界生成器 – 从OpenStreetMaps地图数据生成时区shapefile。 包括海岸附近的领海。

以下项目以前是时区边界数据的来源,但不再积极维护。

  • tz_world – 来自Eric Muller的原始shapefile数据
  • wherewhere-时区 – 合并了WOEDB数据的GeoJSON版本

时区地理定位离线实施

使用时区边界生成器数据的实现

  • node-geo-tz – JavaScript库
  • tz-lookup – JavaScript库
  • GeoTimeZone – .NET库
  • timezonefinder – Python库

使用较旧的tz_world数据的实现

  • latlong – 去图书馆(也读这篇文章 。)
  • TimeZoneMapper – Java库
  • tzwhere – JavaScript / Node库
  • pytzwhere – Python库
  • timezone_finder – Ruby库
  • LatLongToTimeZone – Java和Swift库
  • 现在几点钟? – 描述PHP和MongoDB的博客文章

调用其中一个Web服务的库

  • 时区 – 调用GeoNames的Ruby gem
  • AskGeo拥有自己的库,可以从Java或.Net进行调用
  • GeoNames拥有几乎所有的客户端库

其他想法

  • 用R-Treefind最近的城市
  • 使用MySQL查找最近的城市

如果您知道其他人,请更新此列表

另外请注意,最接近城市的方法可能不会产生“正确”的结果,只是一个近似值。

转换到Windows区域

列出的大部分方法都将返回一个IANA时区标识。 如果您需要转换为Windows时区以使用.NET中的TimeZoneInfo类,请使用TimeZoneConverter库。

不要使用zone.tab

tz数据库包含一个名为zone.tab的文件。 此文件主要用于显示用户从中select的时区列表。 它包括每个时区的参考点的纬度和经度坐标。 这允许创build地图来突出显示这些点。 例如,请参阅时区主页上显示的交互式地图。

尽pipe使用这些数据来parsing纬度和经度坐标的时区可能是很诱人的,但考虑到这些是点 – 而不是边界。 最好的办法是确定最接近的点,在许多情况下,这不是正确的点。

考虑下面的例子:

时区示例艺术

这两个方块表示不同的时区,每个方块中的黑点是参考位置,例如zone.tab中可以find的地方。 蓝点表示我们试图find时区的位置。 很显然,这个位置在左边的橙色区域内,但是如果我们只是看距参考点最近的距离,它将会解决到右边的绿色区域。

这个解决scheme如何node.js https://github.com/mattbornski/tzwhere

和它的Python对应: https : //github.com/pegler/pytzwhere

我们在Teleport刚开始开放我们的API ,其中一个用例也暴露了TZ的坐标信息。

例如,可以按照以下方式请求我们所有可用的TZ信息:

 curl -s https://api.teleport.org/api/locations/59.4372,24.7453/?embed=location:nearest-cities/location:nearest-city/city:timezone/tz:offsets-now | jq '._embedded."location:nearest-cities"[0]._embedded."location:nearest-city"._embedded."city:timezone"' 

这将返回以下内容

 { "_embedded": { "tz:offsets-now": { "_links": { "self": { "href": "https://api.teleport.org/api/timezones/iana:Europe%2FTallinn/offsets/?date=2015-09-07T11%3A20%3A09Z" } }, "base_offset_min": 120, "dst_offset_min": 60, "end_time": "2015-10-25T01:00:00Z", "short_name": "EEST", "total_offset_min": 180, "transition_time": "2015-03-29T01:00:00Z" } }, "_links": { "self": { "href": "https://api.teleport.org/api/timezones/iana:Europe%2FTallinn/" }, "tz:offsets": { "href": "https://api.teleport.org/api/timezones/iana:Europe%2FTallinn/offsets/{?date}", "templated": true }, "tz:offsets-now": { "href": "https://api.teleport.org/api/timezones/iana:Europe%2FTallinn/offsets/?date=2015-09-07T11%3A20%3A09Z" } }, "iana_name": "Europe/Tallinn" } 

对于我使用./jq进行JSONparsing的例子。

您可以使用geolocator.js轻松获取时区和更多…

它使用需要密钥的Google API。 所以,首先你configurationgeolocator:

 geolocator.config({ language: "en", google: { version: "3", key: "YOUR-GOOGLE-API-KEY" } }); 

获取时区,如果你有坐标:

 geolocator.getTimeZone(options, function (err, timezone) { console.log(err || timezone); }); 

示例输出:

 { id: "Europe/Paris", name: "Central European Standard Time", abbr: "CEST", dstOffset: 0, rawOffset: 3600, timestamp: 1455733120 } 

find然后获取时区等等

如果您没有坐标,可以先find用户位置。

下面的示例将首先尝试使用HTML5 Geolocation API来获取坐标。 如果失败或被拒绝,将通过Geo-IP查找得到坐标。 最后,它将获得时区和更多…

 var options = { enableHighAccuracy: true, timeout: 6000, maximumAge: 0, desiredAccuracy: 30, fallbackToIP: true, // if HTML5 fails or rejected addressLookup: true, // this will get full address information timezone: true, map: "my-map" // this will even create a map for you }; geolocator.locate(options, function (err, location) { console.log(err || location); }); 

示例输出:

 { coords: { latitude: 37.4224764, longitude: -122.0842499, accuracy: 30, altitude: null, altitudeAccuracy: null, heading: null, speed: null }, address: { commonName: "", street: "Amphitheatre Pkwy", route: "Amphitheatre Pkwy", streetNumber: "1600", neighborhood: "", town: "", city: "Mountain View", region: "Santa Clara County", state: "California", stateCode: "CA", postalCode: "94043", country: "United States", countryCode: "US" }, formattedAddress: "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA", type: "ROOFTOP", placeId: "ChIJ2eUgeAK6j4ARbn5u_wAGqWA", timezone: { id: "America/Los_Angeles", name: "Pacific Standard Time", abbr: "PST", dstOffset: 0, rawOffset: -28800 }, flag: "ajax/libs/flag-icon-css/2.3.1/flags/4x3/us.svg", map: { element: HTMLElement, instance: Object, // google.maps.Map marker: Object, // google.maps.Marker infoWindow: Object, // google.maps.InfoWindow options: Object // map options }, timestamp: 1456795956380 } 

好的,这里是没有正确的NTP时间的短版本:

 String get_xml_server_reponse(String server_url){ URL xml_server = null; String xmltext = ""; InputStream input; try { xml_server = new URL(server_url); try { input = xml_server.openConnection().getInputStream(); final BufferedReader reader = new BufferedReader(new InputStreamReader(input)); final StringBuilder sBuf = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sBuf.append(line); } } catch (IOException e) { Log.e(e.getMessage(), "XML parser, stream2string 1"); } finally { try { input.close(); } catch (IOException e) { Log.e(e.getMessage(), "XML parser, stream2string 2"); } } xmltext = sBuf.toString(); } catch (IOException e1) { e1.printStackTrace(); } } catch (MalformedURLException e1) { e1.printStackTrace(); } return xmltext; } long get_time_zone_time_l(GeoPoint gp){ String raw_offset = ""; String dst_offset = ""; double Longitude = gp.getLongitudeE6()/1E6; double Latitude = gp.getLatitudeE6()/1E6; long tsLong = System.currentTimeMillis()/1000; if (tsLong != 0) { // https://maps.googleapis.com/maps/api/timezone/xml?location=39.6034810,-119.6822510&timestamp=1331161200&sensor=false String request = "https://maps.googleapis.com/maps/api/timezone/xml?location="+Latitude+","+ Longitude+ "&timestamp="+tsLong +"&sensor=false"; String xmltext = get_xml_server_reponse(request); if(xmltext.compareTo("")!= 0) { int startpos = xmltext.indexOf("<TimeZoneResponse"); xmltext = xmltext.substring(startpos); XmlPullParser parser; try { parser = XmlPullParserFactory.newInstance().newPullParser(); parser.setInput(new StringReader (xmltext)); int eventType = parser.getEventType(); String tagName = ""; while(eventType != XmlPullParser.END_DOCUMENT) { switch(eventType) { case XmlPullParser.START_TAG: tagName = parser.getName(); break; case XmlPullParser.TEXT : if (tagName.equalsIgnoreCase("raw_offset")) if(raw_offset.compareTo("")== 0) raw_offset = parser.getText(); if (tagName.equalsIgnoreCase("dst_offset")) if(dst_offset.compareTo("")== 0) dst_offset = parser.getText(); break; } try { eventType = parser.next(); } catch (IOException e) { e.printStackTrace(); } } } catch (XmlPullParserException e) { e.printStackTrace(); erg += e.toString(); } } int ro = 0; if(raw_offset.compareTo("")!= 0) { float rof = str_to_float(raw_offset); ro = (int)rof; } int dof = 0; if(dst_offset.compareTo("")!= 0) { float doff = str_to_float(dst_offset); dof = (int)doff; } tsLong = (tsLong + ro + dof) * 1000; } return tsLong; } 

和它一起使用:

 GeoPoint gp = new GeoPoint(39.6034810,-119.6822510); long Current_TimeZone_Time_l = get_time_zone_time_l(gp); 

如果你想使用geonames.org然后使用这个代码。 (但是geonames.org有时候很慢)

 String get_time_zone_time_geonames(GeoPoint gp){ String erg = ""; double Longitude = gp.getLongitudeE6()/1E6; double Latitude = gp.getLatitudeE6()/1E6; String request = "http://ws.geonames.org/timezone?lat="+Latitude+"&lng="+ Longitude+ "&style=full"; URL time_zone_time = null; InputStream input; // final StringBuilder sBuf = new StringBuilder(); try { time_zone_time = new URL(request); try { input = time_zone_time.openConnection().getInputStream(); final BufferedReader reader = new BufferedReader(new InputStreamReader(input)); final StringBuilder sBuf = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sBuf.append(line); } } catch (IOException e) { Log.e(e.getMessage(), "XML parser, stream2string 1"); } finally { try { input.close(); } catch (IOException e) { Log.e(e.getMessage(), "XML parser, stream2string 2"); } } String xmltext = sBuf.toString(); int startpos = xmltext.indexOf("<geonames"); xmltext = xmltext.substring(startpos); XmlPullParser parser; try { parser = XmlPullParserFactory.newInstance().newPullParser(); parser.setInput(new StringReader (xmltext)); int eventType = parser.getEventType(); String tagName = ""; while(eventType != XmlPullParser.END_DOCUMENT) { switch(eventType) { case XmlPullParser.START_TAG: tagName = parser.getName(); break; case XmlPullParser.TEXT : if (tagName.equalsIgnoreCase("time")) erg = parser.getText(); break; } try { eventType = parser.next(); } catch (IOException e) { e.printStackTrace(); } } } catch (XmlPullParserException e) { e.printStackTrace(); erg += e.toString(); } } catch (IOException e1) { e1.printStackTrace(); } } catch (MalformedURLException e1) { e1.printStackTrace(); } return erg; } 

和它一起使用:

 GeoPoint gp = new GeoPoint(39.6034810,-119.6822510); String Current_TimeZone_Time = get_time_zone_time_geonames(gp); 

通过使用纬度和经度得到当前位置下面的代码为我工作的时区

 String data = null; LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); Location ll = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); double lat = 0,lng = 0; if(ll!=null){ lat=ll.getLatitude(); lng=ll.getLongitude(); } System.out.println(" Last known location of device == "+lat+" "+lng); InputStream iStream = null; HttpURLConnection urlConnection = null; try{ timezoneurl = timezoneurl+"location=22.7260783,75.8781553&timestamp=1331161200"; //&key=AIzaSyDZMS5Za6yG_66gAK8PL_KH1ZSS9NbWC"; // timezoneurl = timezoneurl+"location="+lat+","+lng+"&timestamp=1331161200";//&key=AIzaSyDZMS5Za6yG_66gAK8PL_KH1ZSS9NbWCbg"; URL url = new URL(timezoneurl); // Creating an http connection to communicate with url urlConnection = (HttpURLConnection) url.openConnection(); // Connecting to url urlConnection.connect(); // Reading data from url iStream = urlConnection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); StringBuffer sb = new StringBuffer(); String line = ""; while( ( line = br.readLine()) != null){ sb.append(line); } data = sb.toString(); br.close(); }catch(Exception e){ Log.d("Exception while downloading url", e.toString()); }finally{ try { iStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } urlConnection.disconnect(); } try { if(data!=null){ JSONObject jobj=new JSONObject(data); timezoneId = jobj.getString("timeZoneId"); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); format.setTimeZone(TimeZone.getTimeZone(timezoneId)); Calendar cl = Calendar.getInstance(TimeZone.getTimeZone(timezoneId)); System.out.println("time zone id in android == "+timezoneId); System.out.println("time zone of device in android == "+TimeZone.getTimeZone(timezoneId)); System.out.println("time fo device in android "+cl.getTime()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } 

认识到这是一个比大多数人怀疑的更复杂的问题。 在实践中,我们中的许多人也愿意接受一套适用于“尽可能多的情况下”的代码,至less它的致命问题可以被识别并最小化。 所以我把这一切和OP的精神都记在脑子里。 最后,对于其他尝试将GPS转换为时区的用户来说,实际价值在于具有位置敏感时间对象的最终目标(更重要的是帮助提高具有此wiki的时间对象的平均实现的质量)我在Python中生成的内容(请随时编辑):

 import pytz from datetime import datetime from tzwhere import tzwhere def timezoned_unixtime(latitude, longitude, dt): tzw = tzwhere.tzwhere() timezone_str = tzw.tzNameAt(latitude, longitude) timezone = pytz.timezone(timezone_str) timezone_aware_datetime = timezone.localize(dt, is_dst=None) unix_time = (timezone_aware_datetime - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds() return unix_time dt = datetime(year=2017, month=1, day=17, hour=12, minute=0, second=0) print timezoned_unixtime(latitude=40.747854, longitude=-74.004733, dt=dt) 
  1. 有几个网上有geojson时区数据源( 这里是一个 , 这里是另一个)

  2. 使用几何库从geojson坐标(shapely [python], GEOS [c ++], JTS [java], NTS [.net])创build多边形对象。

  3. 将你的lat / lng转换成一个点对象(不过你的库代表那个),并检查它是否与时区多边形相交。

     from shapely.geometry import Polygon, Point def get_tz_from_lat_lng(lat, lng): for tz, geojson in timezones.iteritems(): coordinates = geojson['features'][0]['geometry']['coordinates'] polygon = Polygon(coordinates) point = Point(lng, lat) if polygon.contains(point): return tz 

使用当前的NTP时间客户端,尝试使用此代码从Java使用Google时区API,并更正UTC_Datetime_from_timestamp转换:

 String get_xml_server_reponse(String server_url){ URL xml_server = null; String xmltext = ""; InputStream input; try { xml_server = new URL(server_url); try { input = xml_server.openConnection().getInputStream(); final BufferedReader reader = new BufferedReader(new InputStreamReader(input)); final StringBuilder sBuf = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sBuf.append(line); } } catch (IOException e) { Log.e(e.getMessage(), "XML parser, stream2string 1"); } finally { try { input.close(); } catch (IOException e) { Log.e(e.getMessage(), "XML parser, stream2string 2"); } } xmltext = sBuf.toString(); } catch (IOException e1) { e1.printStackTrace(); } } catch (MalformedURLException e1) { e1.printStackTrace(); } return xmltext; } private String get_UTC_Datetime_from_timestamp(long timeStamp){ try{ Calendar cal = Calendar.getInstance(); TimeZone tz = cal.getTimeZone(); int tzt = tz.getOffset(System.currentTimeMillis()); timeStamp -= tzt; // DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.getDefault()); DateFormat sdf = new SimpleDateFormat(); Date netDate = (new Date(timeStamp)); return sdf.format(netDate); } catch(Exception ex){ return ""; } } class NTP_UTC_Time { private static final String TAG = "SntpClient"; private static final int RECEIVE_TIME_OFFSET = 32; private static final int TRANSMIT_TIME_OFFSET = 40; private static final int NTP_PACKET_SIZE = 48; private static final int NTP_PORT = 123; private static final int NTP_MODE_CLIENT = 3; private static final int NTP_VERSION = 3; // Number of seconds between Jan 1, 1900 and Jan 1, 1970 // 70 years plus 17 leap days private static final long OFFSET_1900_TO_1970 = ((365L * 70L) + 17L) * 24L * 60L * 60L; private long mNtpTime; public boolean requestTime(String host, int timeout) { try { DatagramSocket socket = new DatagramSocket(); socket.setSoTimeout(timeout); InetAddress address = InetAddress.getByName(host); byte[] buffer = new byte[NTP_PACKET_SIZE]; DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, NTP_PORT); buffer[0] = NTP_MODE_CLIENT | (NTP_VERSION << 3); writeTimeStamp(buffer, TRANSMIT_TIME_OFFSET); socket.send(request); // read the response DatagramPacket response = new DatagramPacket(buffer, buffer.length); socket.receive(response); socket.close(); mNtpTime = readTimeStamp(buffer, RECEIVE_TIME_OFFSET); } catch (Exception e) { // if (Config.LOGD) Log.d(TAG, "request time failed: " + e); return false; } return true; } public long getNtpTime() { return mNtpTime; } /** * Reads an unsigned 32 bit big endian number from the given offset in the buffer. */ private long read32(byte[] buffer, int offset) { byte b0 = buffer[offset]; byte b1 = buffer[offset+1]; byte b2 = buffer[offset+2]; byte b3 = buffer[offset+3]; // convert signed bytes to unsigned values int i0 = ((b0 & 0x80) == 0x80 ? (b0 & 0x7F) + 0x80 : b0); int i1 = ((b1 & 0x80) == 0x80 ? (b1 & 0x7F) + 0x80 : b1); int i2 = ((b2 & 0x80) == 0x80 ? (b2 & 0x7F) + 0x80 : b2); int i3 = ((b3 & 0x80) == 0x80 ? (b3 & 0x7F) + 0x80 : b3); return ((long)i0 << 24) + ((long)i1 << 16) + ((long)i2 << 8) + (long)i3; } /** * Reads the NTP time stamp at the given offset in the buffer and returns * it as a system time (milliseconds since January 1, 1970). */ private long readTimeStamp(byte[] buffer, int offset) { long seconds = read32(buffer, offset); long fraction = read32(buffer, offset + 4); return ((seconds - OFFSET_1900_TO_1970) * 1000) + ((fraction * 1000L) / 0x100000000L); } /** * Writes 0 as NTP starttime stamp in the buffer. --> Then NTP returns Time OFFSET since 1900 */ private void writeTimeStamp(byte[] buffer, int offset) { int ofs = offset++; for (int i=ofs;i<(ofs+8);i++) buffer[i] = (byte)(0); } } String get_time_zone_time(GeoPoint gp){ String erg = ""; String raw_offset = ""; String dst_offset = ""; double Longitude = gp.getLongitudeE6()/1E6; double Latitude = gp.getLatitudeE6()/1E6; long tsLong = 0; // System.currentTimeMillis()/1000; NTP_UTC_Time client = new NTP_UTC_Time(); if (client.requestTime("pool.ntp.org", 2000)) { tsLong = client.getNtpTime(); } if (tsLong != 0) { tsLong = tsLong / 1000; // https://maps.googleapis.com/maps/api/timezone/xml?location=39.6034810,-119.6822510&timestamp=1331161200&sensor=false String request = "https://maps.googleapis.com/maps/api/timezone/xml?location="+Latitude+","+ Longitude+ "&timestamp="+tsLong +"&sensor=false"; String xmltext = get_xml_server_reponse(request); if(xmltext.compareTo("")!= 0) { int startpos = xmltext.indexOf("<TimeZoneResponse"); xmltext = xmltext.substring(startpos); XmlPullParser parser; try { parser = XmlPullParserFactory.newInstance().newPullParser(); parser.setInput(new StringReader (xmltext)); int eventType = parser.getEventType(); String tagName = ""; while(eventType != XmlPullParser.END_DOCUMENT) { switch(eventType) { case XmlPullParser.START_TAG: tagName = parser.getName(); break; case XmlPullParser.TEXT : if (tagName.equalsIgnoreCase("raw_offset")) if(raw_offset.compareTo("")== 0) raw_offset = parser.getText(); if (tagName.equalsIgnoreCase("dst_offset")) if(dst_offset.compareTo("")== 0) dst_offset = parser.getText(); break; } try { eventType = parser.next(); } catch (IOException e) { e.printStackTrace(); } } } catch (XmlPullParserException e) { e.printStackTrace(); erg += e.toString(); } } int ro = 0; if(raw_offset.compareTo("")!= 0) { float rof = str_to_float(raw_offset); ro = (int)rof; } int dof = 0; if(dst_offset.compareTo("")!= 0) { float doff = str_to_float(dst_offset); dof = (int)doff; } tsLong = (tsLong + ro + dof) * 1000; erg = get_UTC_Datetime_from_timestamp(tsLong); } return erg; } 

和它一起使用:

 GeoPoint gp = new GeoPoint(39.6034810,-119.6822510); String Current_TimeZone_Time = get_time_zone_time(gp); 

https://en.wikipedia.org/wiki/Great-circle_distance

这是一个很好的实现使用JSON数据: https : //github.com/agap/llttz

 public TimeZone nearestTimeZone(Location node) { double bestDistance = Double.MAX_VALUE; Location bestGuess = timeZones.get(0); for (Location current : timeZones.subList(1, timeZones.size())) { double newDistance = distanceInKilometers(node, current); if (newDistance < bestDistance) { bestDistance = newDistance; bestGuess = current; } } return java.util.TimeZone.getTimeZone(bestGuess.getZone()); } protected double distanceInKilometers(final double latFrom, final double lonFrom, final double latTo, final double lonTo) { final double meridianLength = 111.1; return meridianLength * centralAngle(latFrom, lonFrom, latTo, lonTo); } protected double centralAngle(final Location from, final Location to) { return centralAngle(from.getLatitude(), from.getLongitude(), to.getLatitude(), to.getLongitude()); } protected double centralAngle(final double latFrom, final double lonFrom, final double latTo, final double lonTo) { final double latFromRad = toRadians(latFrom), lonFromRad = toRadians(lonFrom), latToRad = toRadians(latTo), lonToRad = toRadians(lonTo); final double centralAngle = toDegrees(acos(sin(latFromRad) * sin(latToRad) + cos(latFromRad) * cos(latToRad) * cos(lonToRad - lonFromRad))); return centralAngle <= 180.0 ? centralAngle : (360.0 - centralAngle); } protected double distanceInKilometers(final Location from, final Location to) { return distanceInKilometers(from.getLatitude(), from.getLongitude(), to.getLatitude(), to.getLongitude()); } } 

从Guppy:

 import geocoders g = geocoders.GoogleV3() place, (lat, lng) = g.geocode('Fairbanks') print place, (lat, lng) Fairbanks, AK, USA (64.8377778, -147.7163889) timezone = g.timezone((lat, lng)) print timezone.dst 

DstTzInfo绑定方法America/Anchorage.dst

美洲/安克雷奇“LMT-1日,14:00:00 STD

如果您更喜欢避免使用Web服务,则可以像这样从浏览器中检索信息:

 var d = new Date(); var usertime = d.toLocaleString(); //some browsers / OSs provide the timezone name in their local string var tzsregex = /\b(ACDT|ACST|ACT|ADT|AEDT|AEST|AFT|AKDT|AKST|AMST|AMT|ART|AST|AWDT|AWST|AZOST|AZT|BDT|BIOT|BIT|BOT|BRT|BST|BTT|CAT|CCT|CDT|CEDT|CEST|CET|CHADT|CHAST|CIST|CKT|CLST|CLT|COST|COT|CST|CT|CVT|CXT|CHST|DFT|EAST|EAT|ECT|EDT|EEDT|EEST|EET|EST|FJT|FKST|FKT|GALT|GET|GFT|GILT|GIT|GMT|GST|GYT|HADT|HAEC|HAST|HKT|HMT|HST|ICT|IDT|IRKT|IRST|IST|JST|KRAT|KST|LHST|LINT|MART|MAGT|MDT|MET|MEST|MIT|MSD|MSK|MST|MUT|MYT|NDT|NFT|NPT|NST|NT|NZDT|NZST|OMST|PDT|PETT|PHOT|PKT|PST|RET|SAMT|SAST|SBT|SCT|SGT|SLT|SST|TAHT|THA|UYST|UYT|VET|VLAT|WAT|WEDT|WEST|WET|WST|YAKT|YEKT)\b/gi; //in other browsers the timezone needs to be estimated based on the offset var timezonenames = {"UTC+0":"GMT","UTC+1":"CET","UTC+2":"EET","UTC+3":"EEDT","UTC+3.5":"IRST","UTC+4":"MSD","UTC+4.5":"AFT","UTC+5":"PKT","UTC+5.5":"IST","UTC+6":"BST","UTC+6.5":"MST","UTC+7":"THA","UTC+8":"AWST","UTC+9":"AWDT","UTC+9.5":"ACST","UTC+10":"AEST","UTC+10.5":"ACDT","UTC+11":"AEDT","UTC+11.5":"NFT","UTC+12":"NZST","UTC-1":"AZOST","UTC-2":"GST","UTC-3":"BRT","UTC-3.5":"NST","UTC-4":"CLT","UTC-4.5":"VET","UTC-5":"EST","UTC-6":"CST","UTC-7":"MST","UTC-8":"PST","UTC-9":"AKST","UTC-9.5":"MIT","UTC-10":"HST","UTC-11":"SST","UTC-12":"BIT"}; var timezone = usertime.match(tzsregex); if (timezone) { timezone = timezone[timezone.length-1]; } else { var offset = -1*d.getTimezoneOffset()/60; offset = "UTC" + (offset >= 0 ? "+" + offset : offset); timezone = timezonenames[offset]; } //there are 3 variables can use to see the timezone // usertime - full date // offset - UTC offset time // timezone - country console.log('Full Date: ' + usertime); console.log('UTC Offset: ' + offset); console.log('Country Code Timezone: ' + timezone); 

在我目前的情况下是印刷:

全部date: 27/01/2014 16:53:37 UTC抵消: UTC-3 国家代码时区: BRT

希望能有所帮助。