Google地图时区API以UTC格式获取当地时间

时间:2016-02-24 21:56:58

标签: javascript google-maps date time timezone

Google文档说:

  

给定位置的本地时间是timestamp参数与结果中的dstOffset和rawOffset字段的总和。

timestamp + dstOffset + rawOffset =以UTC为单位的本地时间(以秒为单位)

问题

我正在尝试在正确的时区内获取当地时间。 我认为新的Date(timestamp + dstOffset + rawOffset * 1000)将返回UTC的本地时间,但我发现实际的数值确实是在当地时间,在错误的时区(UTC)。

实施例

时间戳: 1456349190

可读时间戳: new Date(1456349190*1000).toGMTString()(2016年2月24日星期三21:26:30 GMT)

https://maps.googleapis.com/maps/api/timezone/json?location=39.2079206,-84.5274616&timestamp=1456349190&key=${googleApiKey}

返回:

  • dstOffset :0
  • rawOffset :-18000
  • timeZoneId :America / New_York

数据:

以秒计算的总和 = 1456349190 + 0 +( - 18000)= 1456331190

以毫秒为单位的总和 = 1456331190 * 1000 = 1456331190000

假设当地日期 = new Date(1456331190000).toGMTString()(2016年2月24日星期三,格林威治标准时间16:26:30)

问题

可读时间戳假定的本地日期是否应该相同,因为它们都是UTC格式? 似乎假定的当地日期应该是星期三,2016年2月24日16:26:30 EST

这是对的吗?

如果是这样,我似乎只需要从假设的本地日期中提取我需要的值(本地小时),并应用从谷歌api timeZoneId 返回的正确时区(America / New_York)因为16:26:30是我需要的当地时间。

有用的提示

这些是帮助我更好地理解时间戳的一些指导原则:

“{{3}}”

2 个答案:

答案 0 :(得分:3)

时间戳值表示自1970年1月1日 UTC 以来的秒数。不是本地时间戳。 enter image description here

Google API会告诉您rawOffset的位置是“-18000” enter image description here

使用时间戳计算日期时,应将单位与UTC对齐。 因为Date类将时间戳视为UTC。

在您的解释中,值1456331190000是本地时间戳,但 Date类将值视为UTC。

这是你的错误点。

enter image description here

这是代码(在Node.js中)

enter image description here

答案 1 :(得分:1)

我刚刚解决了我添加此行的问题:document.getElementById("utc_offset").value = place.utc_offset;

var placeSearch, autocomplete;
var componentForm = {
  street_number: 'short_name',
  route: 'long_name',
  locality: 'long_name',
  administrative_area_level_1: 'short_name',
  country: 'long_name',
  postal_code: 'short_name'

};

function initAutocomplete() {
  // Create the autocomplete object, restricting the search to geographical
  // location types.
  autocomplete = new google.maps.places.Autocomplete(
      /** @type {!HTMLInputElement} */(document.getElementById('autocomplete')),
      {types: ['geocode']});

  // When the user selects an address from the dropdown, populate the address
  // fields in the form.
  autocomplete.addListener('place_changed', fillInAddress);
}

function fillInAddress() {
  // Get the place details from the autocomplete object.
  var place = autocomplete.getPlace();

  for (var component in componentForm) {
    document.getElementById(component).value = '';
    document.getElementById(component).disabled = false;
  }

  // Get each component of the address from the place details
  // and fill the corresponding field on the form.
  for (var i = 0; i < place.address_components.length; i++) {
    var addressType = place.address_components[i].types[0];
    if (componentForm[addressType]) {
      var val = place.address_components[i][componentForm[addressType]];
      document.getElementById(addressType).value = val;
    }
  }
//Get the UTC here and complete the form
  document.getElementById("utc_offset").value = place.utc_offset;
}

// Bias the autocomplete object to the user's geographical location,
// as supplied by the browser's 'navigator.geolocation' object.
function geolocate() {
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position) {
      var geolocation = {
        lat: position.coords.latitude,
        lng: position.coords.longitude
      };
      var circle = new google.maps.Circle({
        center: geolocation,
        radius: position.coords.accuracy
      });
      autocomplete.setBounds(circle.getBounds());
    });
  }
}

参考:https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete-addressform