天气相关的时间计算

From Caiyun Wiki
Jump to: navigation, search

考虑下面的用户案例:

 老人想从北京飞去纽约,28日上午他做了天气查询,他想知道到达纽约后应该穿什么衣服,此时我们的 app 应该给出的是纽约 27 日的日天气概况。

由此可以引申出来,当地天气应该和当地时间联系的原则。

但是在天气相关的时间计算里,有各种复杂的情况,仅仅举几个例子:

  • 日出、日落的计算,依赖于当地的地理上的本地时间
  • 紫外线指数的计算,需要计算当地的地理上的正午时间
  • 计算某一天的天气概况,比如最高温、最低温、平均气温,需要有一个相应的统计时间起点和终点
  • 当地居民日常生活的时间参考,依赖于当地的行政区划上的时间设置
  • 手机用户可能会去观察一个其他地点的天气状况,可能是地理上非常遥远的城市
  • 夏令时(Daylight Saving Time )是否考虑?

概括起来,时间上的参考系统有如下四种:

  • 当地地理上的本地时间系统
  • 当地行政区划上的时间系统
  • 观察者行政区划上的时间系统
  • 夏令时(DST)

在 API v2.3 中,我们采用如下的原则来使用这些时间参考系统:

  • 任何天气现象相关计算中都采用 Unix 时间戳,使用和当地地理上的本地时间系统来进行有关计算
  • 任何给用户的 API 输出里,相关的时间都采用当地行政区划上的时间系统,时间的文字表示遵循 ISO8601 标准
  • 不使用观察者行政区划上的时间系统
  • 不使用夏令时

API v2.3 尚在测试中,存在如下已知 bug:

  • 极圈内的极昼和极夜的情况下,日出和日落时间是错误的

我们计划在 API v2.4 中彻底解决日出日落计算的国际化问题。

在解决方案中,我们会考虑引入:

  • 当地行政区划上的中午时间:也就是太阳位置最高的时间(upper culmination)
  • 当地行政区划上的午夜时间:也就是太阳位置最低的时间(lower culmination)

请参照 https://en.wikipedia.org/wiki/Culmination

我们建议用如下的 API 数据结构

sun: [
    {
        datetime: "2018-11-10T17:03+08:00",
        eventtype: "rise",
    },
    {
        datetime: "2018-11-10T17:03+08:00",
        eventtype: "upperculmination",
    },
    {
        datetime: "2018-11-10T17:03+08:00",
        eventtype: "set",
    },
    {
        datetime: "2018-11-10T17:03+08:00",
        eventtype: "lowerculmination",
    }
]

这个结构的好处是,适应日出日落间隔不定的情况,尤其是极区的情况,同时将来可以拓展到月球、大行星和亮星。