You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将OpenWeather API返回的日落UNIX时间戳转换为城市本地时间?

解决OpenWeather API日落时间戳转目标城市本地时间问题

你遇到的核心问题是:直接将UNIX时间戳转为Date对象时,得到的是运行代码设备的本地时间,而非目标城市的本地时间。OpenWeather返回的sunrise/sunset是UTC时区的UNIX时间戳(单位:秒),而timezone字段是目标城市相对于UTC的偏移秒数(比如Mountain View的-25200对应UTC-7时区,即比UTC时间晚7小时)。

正确转换步骤

要得到目标城市的本地时间,需要把UTC时间戳加上该城市的时区偏移量(转成毫秒后计算),具体操作如下:

  1. 将UTC时间戳(秒)转为毫秒:sunsetTimestamp * 1000
  2. 将时区偏移秒数转为毫秒:timezone * 1000
  3. 两者相加得到目标城市本地时间的毫秒数,再创建Date对象

代码示例

// 从API获取的原始数据
const apiData = {
  "name": "Mountain View",
  "sys": {
    "sunset": 1681612963
  },
  "timezone": -25200
};

// 计算目标城市本地时间
const sunsetUtcMs = apiData.sys.sunset * 1000;
const timezoneOffsetMs = apiData.timezone * 1000;
const localSunsetDate = new Date(sunsetUtcMs + timezoneOffsetMs);

// 格式化输出目标城市本地时间
console.log(localSunsetDate.toLocaleString('en-US', {
  hour12: true,
  year: 'numeric',
  month: 'short',
  day: 'numeric',
  hour: '2-digit',
  minute: '2-digit'
}));
// 输出示例:Apr 14, 2023, 07:02 PM(对应Mountain View本地时间)

原代码错误原因

new Date(sunsetTimestamp * 1000)会把UTC时间戳转换为当前设备所在时区的本地时间。比如你在北京时间的设备上运行,得到的就是UTC+8的时间,而非Mountain View的UTC-7时间。通过加上目标城市的时区偏移量,才能精准得到该城市的本地时间。

额外优化(可选)

如果知道目标城市的时区ID(比如Mountain View对应America/Los_Angeles),可以直接用Intl.DateTimeFormat指定时区,无需手动计算偏移量:

const sunsetUtcDate = new Date(apiData.sys.sunset * 1000);
console.log(sunsetUtcDate.toLocaleString('en-US', {
  timeZone: 'America/Los_Angeles',
  hour12: true,
  year: 'numeric',
  month: 'short',
  day: 'numeric',
  hour: '2-digit',
  minute: '2-digit'
}));

内容的提问来源于stack exchange,提问作者William

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:22:49