为何getUTCMinutes()方法在不同地区返回不同分钟值?
问题:OpenWeather API获取的本地时间分钟数异常
我从OpenWeather API拿数据,想展示不同城市的本地日期和时间。其他部分都正常,但换不同城市时,分钟数会出问题,为啥getUTCMinutes()方法显示的结果不对?
代码示例
const localMinutes = new Date((data.dt + data.timezone) * 1000).getUTCMinutes()
示例JSON数据
{ "coord": { "lon": 10.99, "lat": 44.34 }, "weather": [ { "id": 501, "main": "Rain", "description": "moderate rain", "icon": "10d" } ], "base": "stations", "main": { "temp": 298.48, "feels_like": 298.74, "temp_min": 297.56, "temp_max": 300.05, "pressure": 1015, "humidity": 64, "sea_level": 1015, "grnd_level": 933 }, "visibility": 10000, "wind": { "speed": 0.62, "deg": 349, "gust": 1.18 }, "rain": { "1h": 3.16 }, "clouds": { "all": 100 }, "dt": 1661870592, "sys": { "type": 2, "id": 2075663, "country": "IT", "sunrise": 1661834187, "sunset": 1661882248 }, "timezone": 7200, "id": 3163858, "name": "Zocca", "cod": 200 }
原因和解决办法
问题出在哪
你把dt(UTC时间戳,单位秒)和timezone(时区偏移秒数)相加后,得到的是本地时间对应的UTC时间戳,但你用getUTCMinutes()取的是这个时间戳的UTC分钟数,不是本地时间的分钟数。
举个实际例子:
- 示例里
dt=1661870592对应的UTC时间是2022-08-30 15:23:12 - 加上
timezone=7200(UTC+2小时),得到的时间戳是1661877792,对应的UTC时间是2022-08-30 17:23:12,这时候getUTCMinutes()拿的是23,看起来没问题,但那是因为这个时区偏移是整小时。
如果换个时区偏移带30分钟的城市(比如印度,偏移+5.5小时=19800秒),假设原UTC时间分钟是12,本地时间分钟应该是12+30=42,但相加后的时间戳对应的UTC时间分钟是42,这时候getUTCMinutes()拿的是42,看似对,但本质是你搞反了:你要的是本地时间的分钟数,应该用getMinutes(),而不是getUTCMinutes()。
核心错误就是:你创建的Date对象已经是本地时间的UTC等价物,要获取本地时间字段,得用不带UTC后缀的方法。
修正后的代码
// 生成对应本地时间的Date对象 const localDate = new Date((data.dt + data.timezone) * 1000); // 获取本地时间的分钟数 const localMinutes = localDate.getMinutes(); // 其他本地时间字段同理,用不带UTC的方法: const localHours = localDate.getHours(); const localDay = localDate.getDate();
额外说明
dt是OpenWeather返回的UTC时间戳(秒为单位)timezone是目标城市相对于UTC的偏移秒数(正的是东时区,负的是西时区)- 只有当时区偏移是整小时时,
getUTCMinutes()才会和本地分钟数一致;遇到带30/45分钟偏移的时区,就会出现差异,所以必须用getMinutes()来获取本地分钟数。
内容的提问来源于stack exchange,提问作者Igor Gryp
相关产品推荐
相关产品推荐

