如何将OpenWeather API返回的日落UNIX时间戳转换为城市本地时间?
解决OpenWeather API日落时间戳转目标城市本地时间问题
你遇到的核心问题是:直接将UNIX时间戳转为Date对象时,得到的是运行代码设备的本地时间,而非目标城市的本地时间。OpenWeather返回的sunrise/sunset是UTC时区的UNIX时间戳(单位:秒),而timezone字段是目标城市相对于UTC的偏移秒数(比如Mountain View的-25200对应UTC-7时区,即比UTC时间晚7小时)。
正确转换步骤
要得到目标城市的本地时间,需要把UTC时间戳加上该城市的时区偏移量(转成毫秒后计算),具体操作如下:
- 将UTC时间戳(秒)转为毫秒:
sunsetTimestamp * 1000 - 将时区偏移秒数转为毫秒:
timezone * 1000 - 两者相加得到目标城市本地时间的毫秒数,再创建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
相关产品推荐
相关产品推荐

