我正在寻找一种好的算法来为自定义图表组件上的日期时间轴生成漂亮的主要/次要刻度间隔。我读过this previous question在这里,它讨论了一种计算数字轴的主要/次要刻度和最小/最大值的好方法。但是,很难将其转化为日期轴计算。
原因是有些日期范围与其他日期范围不同,有些甚至不是一致的时间范围。在几分钟内考虑一个轴范围。此计算相当简单,因为您可以使用与上述算法类似的算法来划分分钟数。但是,当要求同一轴以年/月或月/周范围显示数据时,您会怎么做?
此轴的要求是它可以计算主要/次要刻度线,以便图表永远不会太困惑,输入数据范围以毫秒为单位,直到几个月和几年。它旨在用于实时图表,因此静态演示不如快速更新的能力重要。我的简单算法是这样做的:
- 如果范围 > 3 年,选择 major=1 年,minor = 3month
- 如果范围 > 1 年,选择 major=3 个月,minor=1 个月
- 如果范围 > 3 个月,选择 major=month,minor=nothing(我正在考虑周,但是因为月不能被周整除,所以看起来很奇怪)
- 如果范围 > 1 周,选择 major=1 天,minor=nothing
- 如果范围 < 1 天,根据 nice numbers 算法选择小时数
- 如果范围 < 1 小时,请选择分钟
- 如果范围 < 1 分钟,选择秒
等...
如您所见,它有很多 if 语句,可能会漏掉一些东西。在这种方法中,我经常在某些日期遇到故障,我想知道是否有一种简单或通用的方法来解决这个问题。
最好的问候, 安德鲁
最佳答案
- 对所有可能的刻度进行排序:1 秒、1 分钟、1 小时、1 天、1 个月、1 年。
- 确定主要 (
min_dist_major
) 和次要 (min_dist_minor
) 刻度的最小距离。这些是常量并且具有以像素为单位的值。 - 找到在显示器上显示时大于
min_dist_major
的最小主刻度。 - 然后找到在显示器上显示时小于主刻度但大于
min_dist_minor
的最小次刻度。如果找不到小刻度线,则它不存在。
您可以使用其他刻度来扩展您的数组,例如每种类型的 2 个和 5 个。
关于algorithm - 计算日期时间轴最小、最大和主要次要刻度间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8645229/