最近遇到个问题,这里记录一下。
在项目中,提供了个接口:通过经纬度获取天气信息和日出日落时间
如示例:
客户端反馈在美国部分地区出现了白天黑夜UI混乱的问题,比如当地白天时候显示黑夜的UI,黑夜时候又显示白天UI。
客户端使用该接口返回值判断是否在当地白天,判断逻辑是:当前时间戳是否在日出日落时间戳范围内。
那就得看是不是后端返回的日出日落时间戳有问题了。
该接口的后端实现,封装了多个三方天气提供商,发现其中调用weatherbit对返回结果进行封装处理时出现了问题。
weatherbit天气提供商的接口链接:https://www.weatherbit.io/api/weather-current
提供了根据经纬度获取相关地区实时天气
其中的日出日落时间
sunrise:Sunrise time UTC (HH:MM).
sunset:Sunset time UTC (HH:MM).
timezone:Local IANA Timezone.
由于weatherbit接口返回的日出日落时间是时分格式,需要转换成时间戳,项目代码里的处理是这样的。将根据当前时间戳获取到UTC时区的年月日,再拼接上weatherbit接口返回的日出日落时间,按UTC时区转成时间戳,最后保证日出时间戳大于日落时间。
为什么会有
sunrise >= sunset 这个判断处理呢?因为weatherbit接口返回的时间是UTC的,比如深圳5月17日左右的UTC日出日落时间是 21:42 10:58(对应北京时间 05:42 18:58),加上日期信息得出的时间戳日出大于日落,这不合理,所以需要加上这判断处理。
这段代码的问题在哪呢?
在于它的日期信息是根据当前时间获取UTC的年月日,UTC的年月日和用户所在地区时间存在时差。
将问题代码和入参提取出来写一个简单的测试demo
输出结果:

可以看到,在早上6点的请求,返回的日出日落时间是16日的,因为北京时区为+8,此时的UTC还为16日,所以以当前方式算出来的日出日落时间有问题,6点此时应该是白天了,但是因为日出日落时间戳为16日,所以客户端仍显示晚上。
需要等到北京时间8点之后请求的结果才会是17日的,此时显示才是正常。
那么如果将
sunrise = sunrise - 24 * 60 * 60; 这个处理改为 sunset = sunset + 24 * 60 * 60; 行不行呢?不行的,这个也是有问题。需要使用当地时区去校准返回的时间戳。
程序输出如下,可能看到当改成
sunset = sunset + 24 * 60 * 60; ,就只有北京时间0-8点之间的返回值的对的了。
时间本地化在一家全球化的公司中是非常常见的业务需求,需要我们在实际的开发过程中考虑更加周全,以确保时间转换的准确性和一致性。这意味着我们需要处理各种复杂的时间转换问题,例如不同地区的时区差异、夏令时的变化,以及各地的节假日和工作时间安排等。只有在代码中细致地处理这些细节,才能确保时间转换的准确性和一致性,从而提升系统的可靠性和用户体验。
- 作者:Yibin
- 链接:https://yibin.dev/article/fb6b37c8-d31b-4d03-9b0a-abd43bbcaa2f
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章






