用边界情况而不只是理想路径来测试位置数据
一个位于地图完善的市中心的地址,几乎无法告诉您系统如何处理乡村路线、有争议的边界或靠近两极的查询。请有意识地测试这些困难情况。
计算时区偏移量的软件往往默认某个时区的当前规则一直适用,这个假设一直没有问题,直到您需要正确解读最近一次规则变更之前的时间戳,这时它就会悄悄地给出一个看起来完全合理的错误答案。在跨越相当长时间段存储或处理历史时间戳的系统中,这确实是细微数据损坏的常见来源。
这一点之所以重要,是因为时区规则,包括夏令时的开始和结束日期、标准偏移量,甚至某个位置属于哪个时区,都不是永久固定的。正如其他文章所述,政府修改规则时它们就会改变,而多年前记录的时间戳,需要使用在那个具体日期实际生效的规则,而不是今天生效的规则,才能计算出在另一个时区或 UTC 中对应的正确时刻。
这正是 IANA 时区数据库为每个命名时区保存完整规则变更历史,而不仅仅是当前规则的原因。正确基于该数据库构建的软件可以回答“这个时区在某个具体历史日期的 UTC 偏移量是多少”,这与“这个时区现在的 UTC 偏移量是多少”是真正不同且更复杂的问题,而把两者混为一谈,恰恰就是历史时间戳数据悄悄出错的原因。
这会以具体而实际的方式体现出来。一个为了分析而将历史日志时间戳从当地时间转换为 UTC 的系统,需要使用该日志原始日期和时区的历史规则,而不是当前规则,否则转换就会引入误差,根据所涉及的具体切换,误差在任一方向上最多可达整整一小时。一个跨越历史规则变更的日期来计算某人年龄或合同期限的系统,也需要同样小心,尽管那里的影响通常较小。即使只是将一个旧时间戳按用户当前的当地时间显示出来,也需要通过原始时区和日期对应的正确历史规则进行转换,而不是当前规则。
实用的建议是:始终使用了解所涉具体时区和日期历史规则变更的系统来进行时区转换,而不是只知道当前规则的系统;对于任何批量转换历史数据、且时间跨度可能包含规则变更的流程,都要格外小心。我们的时区查询可以针对某个具体时刻进行查询,并应用该日期实际生效的规则,这正是正确处理历史数据所需要的行为,而不是无论实际处理的是哪个日期,每次计算都默认使用今天的规则。