Difference between revisions of "天气相关的时间计算"

From Caiyun Wiki
Jump to: navigation, search
 
(3 intermediate revisions by the same user not shown)
Line 28: Line 28:
 
* 极圈内的极昼和极夜的情况下,日出和日落时间是错误的
 
* 极圈内的极昼和极夜的情况下,日出和日落时间是错误的
  
这个 bug 我们计划这样来解决,在极昼和极夜的情况下,不给出日出日落时间,而是给出:
+
我们计划在 API v2.4 中彻底解决日出日落计算的国际化问题。
* 昼夜状态
+
 
 +
在解决方案中,我们会考虑引入:
 
* 当地行政区划上的中午时间:也就是太阳位置最高的时间(upper culmination)
 
* 当地行政区划上的中午时间:也就是太阳位置最高的时间(upper culmination)
 
* 当地行政区划上的午夜时间:也就是太阳位置最低的时间(lower culmination)
 
* 当地行政区划上的午夜时间:也就是太阳位置最低的时间(lower culmination)
 
请参照 https://en.wikipedia.org/wiki/Culmination
 
请参照 https://en.wikipedia.org/wiki/Culmination
 
所以天级别的 astro 组里会给出如下信息:
 
* status:normal、polarday 或者 polarnight
 
* sunrise:时刻或者 null
 
* sunset:时刻或者 null
 
* upperculmination:时刻
 
* lowerculmination:时刻
 
  
 
我们建议用如下的 API 数据结构
 
我们建议用如下的 API 数据结构
Line 46: Line 40:
 
sun: [
 
sun: [
 
     {
 
     {
         datetime: "2018-11-10 17:03UCT+8",
+
         datetime: "2018-11-10T17:03+08:00",
 
         eventtype: "rise",
 
         eventtype: "rise",
 
     },
 
     },
 
     {
 
     {
         datetime: "2018-11-10 17:03UCT+8",
+
         datetime: "2018-11-10T17:03+08:00",
 
         eventtype: "upperculmination",
 
         eventtype: "upperculmination",
 
     },
 
     },
 
     {
 
     {
         datetime: "2018-11-10 17:03UCT+8",
+
         datetime: "2018-11-10T17:03+08:00",
 
         eventtype: "set",
 
         eventtype: "set",
 
     },
 
     },
 
     {
 
     {
         datetime: "2018-11-10 17:03UCT+8",
+
         datetime: "2018-11-10T17:03+08:00",
 
         eventtype: "lowerculmination",
 
         eventtype: "lowerculmination",
    },
 
    {
 
        datetime: "2018-11-10 17:03UCT+8",
 
        eventtype: "sunset",
 
 
     }
 
     }
 
]
 
]
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
这个结构的好处是,适应日出日落间隔不定的情况,尤其是极区的情况,同时将来可以拓展到月球、大行星和亮星。

Latest revision as of 07:05, 10 November 2018

考虑下面的用户案例:

 老人想从北京飞去纽约,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",
    }
]

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