【问题标题】:Invalid sunrise/set times?日出/设置时间无效?
【发布时间】:2020-06-05 16:35:47
【问题描述】:

我得到了日出/日落时间的虚假值(例如内华达州):

let url = "http://api.openweathermap.org/data/2.5/weather?q=Nevada,us&APPID=<app_id>&units=metric"
let req = new Request(url)
let json = await req.loadJSON()

function convertTime(unixTime){
    let dt = new Date(unixTime * 1000)
    let h = dt.getHours()
    let m = "0" + dt.getMinutes()
    let t = h + ":" + m.substr(-2)
    return t
}

let sRise = convertTime(json.sys.sunrise)
let sSet = convertTime(json.sys.sunset)

alert(convertTime(sRise));
// Shows: 14:32 should be 05:24

alert(convertTime(sSet));
// Shows: 05:10 should be 19:55

我错过了什么吗? (P.S. 我在欧洲,但通过代理得到了相同的结果)。

【问题讨论】:

  • 看起来您每次都在您的 URL 中专门查询美国内华达州:?q=Nevada,us。也许如果您想更改语言环境,请输入其他内容。例如?q=Florence,it&amp;APPID=&lt;app_id&gt;&amp;units=metric
  • 它的时间转换功能。默认情况下,当您使用dt.getHours 时,它会返回本地时间 的小时数。欧洲的14:32是内华达州的日出,这似乎并不过分。
  • 您正在使用返回的时间戳创建本地日期,因此 JavaScript 会认为您需要 您的时区的日期实例,而不是目标时区。
  • 考虑放弃 convertTime 功能,转而使用更灵活且内置的 Date.toLocaleTimeString
  • 注意:timezonesys 一起返回的数据元素具有(我相信)目标时区与 UTC 的秒数变化。

标签: javascript openweathermap


【解决方案1】:

天气 API (https://openweathermap.org/current) 具有另一个数据元素,可帮助将 sys 对象提供的 UTC 时间转换为请求区域的本地时间。您的转换函数需要考虑偏移量。示例:

let url = "http://api.openweathermap.org/data/2.5/weather?q=Nevada,us&APPID=<app_id>&units=metric"
let req = new Request(url)
let json = await req.loadJSON()

function convertTime(unixTime, offset){
    let dt = new Date((unixTime + offset) * 1000)
    let h = dt.getHours()
    let m = "0" + dt.getMinutes()
    let t = h + ":" + m.substr(-2)
    return t
}

let sRise = convertTime(json.sys.sunrise, json.timezone)
let sSet = convertTime(json.sys.sunset, json.timezone)

alert(convertTime(sRise));
// Shows: 05:24

alert(convertTime(sSet));
// Shows: 19:55

【讨论】:

    猜你喜欢
    • 2016-07-06
    • 2013-10-17
    • 2019-12-26
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    相关资源
    最近更新 更多