天气相关的时间计算

From Caiyun Wiki
Revision as of 05:43, 10 November 2018 by Mingli (talk | contribs)
Jump to: navigation, search

考虑下面的用户案例:

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

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

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

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

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

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

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

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

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

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

这个 bug 我们计划这样来解决,在极昼和极夜的情况下,不给出日出日落时间,而是给出:

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

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

所以天级别的 astro 组里会给出如下信息:

  • status:normal、polarday 或者 polarnight
  • sunrise:时刻或者 null
  • sunset:时刻或者 null
  • upperculmination:时刻
  • lowerculmination:时刻

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

sun: [
    {
        datetime: "2018-11-10 17:03UCT+8",
        eventtype: "rise",
    },
    {
        datetime: "2018-11-10 17:03UCT+8",
        eventtype: "upperculmination",
    },
    {
        datetime: "2018-11-10 17:03UCT+8",
        eventtype: "set",
    },
    {
        datetime: "2018-11-10 17:03UCT+8",
        eventtype: "lowerculmination",
    },
    {
        datetime: "2018-11-10 17:03UCT+8",
        eventtype: "sunset",
    }
]