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

基于OpenWeather API时区的Unix时间戳转本地时间JS代码验证

问题分析与解决方案

你的代码转换日出日落时间出错的核心问题有两点:

1. 错误的时间戳计算逻辑

OpenWeather API返回的sunrise/sunset是UTC时区的秒级Unix时间戳,而timezone字段是目标城市时区相对于UTC的偏移秒数(多伦多的-18000即UTC-5小时)。你直接将UTC时间戳与时区偏移相加,得到的是错误的时间戳——这相当于把目标城市的本地时间当成了UTC时间,而非将UTC时间转换为本地时间。

2. 未指定目标时区的格式化

toLocaleTimeString()不传入timeZone参数时,会默认使用代码运行环境的本地时区(比如你电脑的时区),而非多伦多的时区,这会导致最终显示的时间不是目标城市的本地时间。

修正后的代码

直接基于UTC时间戳创建Date对象,然后指定目标城市的时区进行格式化即可:

// 转换日出时间:UTC时间戳转毫秒,指定多伦多时区格式化
const sunriseLocal = new Date(weatherData.sys.sunrise * 1000).toLocaleTimeString([], {
  hour: '2-digit',
  minute: '2-digit',
  timeZone: 'America/Toronto'
});

// 转换日落时间
const sunsetLocal = new Date(weatherData.sys.sunset * 1000).toLocaleTimeString([], {
  hour: '2-digit',
  minute: '2-digit',
  timeZone: 'America/Toronto'
});

console.log(sunriseLocal); // 输出:07:29(与谷歌的7:26接近,差异源于API数据的时间精度)
console.log(sunsetLocal); // 输出:16:42(与谷歌的4:44基本一致)

验证你的API数据

用你提供的多伦多API数据计算:

  • sunrise: 1732883394 → UTC时间为2024-11-29T12:29:54Z,多伦多本地时间为12:29:54 - 5小时 = 07:29:54
  • sunset: 1732916569 → UTC时间为2024-11-29T21:42:49Z,多伦多本地时间为21:42:49 -5小时 = 16:42:49

这个结果和谷歌显示的时间基本吻合,说明修正后的代码是正确的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:04:59