oranfry / periods
Requires
- php: >=8.1
README
一个用于时间分割的框架
简介
时间段 是将日历上的所有日期分割成系统的方法。例如,月份 和 星期 就是时间段,因为它们是分割日历而没有重叠和间隙的方法。
此框架的目的是允许轻松实现和使用时间段,包括自定义设计的时间段。
自定义时间段的例子可能包括
- 从星期二开始,到下一个星期一结束的一周
- 从正常日历月份的第二周一开始的月份
- 每年4月1日开始的财年
- 日本年代
- 杰夫·高布伦出生前和出生后的时间
正如你从最后几个例子中猜到的,时间段不需要有任何数学上的统一性或可预测性。时间段作为PHP函数实现,因此分割可以以数学方式或逐个部分的方式实现,具体取决于需求。
术语
所有日期 指所有可能的、有效的日期。根据此框架,“有效日期”意味着所有符合PHP的 strtotime()
函数格式的 'YYYY-MM-DD'(例如,'2023-08-01')的日期,同时也符合PHP的 checkdate()
。大约有3.65M个有效日期。
这意味着早于'0000-00-00'或晚于'9999-12-31'的日期不被接受,并且实现者不需要确定它们属于哪个分割。
术语 时间段 指的是分割系统(如“星期”)。
术语 分割 指的是该系统下的特定分割(如“2024年第47周”)。
如何实现
要实现自定义时间段(即自定义系统),你只需要能够生成包含任何给定日期的分割的开始和结束日期。
例如,假设你希望实现“从星期二开始的一周”的时间段。你将实现以下方法,它们接受任意有效日期,并按指定返回计算结果
_start($date)
:返回给定日期或之前的最后一个星期二_end($date)
:返回给定日期或之后的第一个星期一
请注意,开始和结束日期是包含的,所以如果时间段开始和结束在同一天,它就是1天长。
一些限制条件
- 时间线上第一个分割可以没有开始日期
- 时间线上最后一个分割可以没有结束日期
- 有开始日期的分割始终从一天的开始开始
- 有结束日期的分割始终在一天结束时结束
- 所有分割必须至少一天长(即结束日期不能早于开始日期)
- 每个日期必须恰好包含在一个分割中;分割之间没有间隙,也没有重叠
此框架不尝试验证你的实现是否符合这些限制条件,因此声明,如果你不遵守这些限制条件,你将得到未定义的行为。请放置一些单元测试以验证你实现的任何时间段。将来,我将在开发中添加时间段的测试框架。
此框架负责确保只将有效日期传递给你的 _start()
和 _end()
方法。
可选实现
可选地,您还可以通过实现方法 _chunkId($from, $to)
和 _chunkLabel($from, $to)
来实现块ID和标签。以下是根据不同周期系统在相同周期间的示例标签
- 2024年11月25日 ~ 2024年12月1日
- 2024年第47周
- 杰夫·高布兰生命中的第3749周
相应的ID选项可能如下
- 2024-11-25~2024-12-01
- 2024w47
- w3749
如果您在单个应用程序中使用多个周期系统,并希望确保块ID之间不冲突,请在保存前在每个ID前添加一个与周期独特的标识
- W2024-11-25~2024-12-01
- W2024w47
- JGw3749
框架确保只有真实块的开始和结束日期会被传递到您的 _chunkId()
和 _chunkLabel()
方法。
使用方法
请参阅以下示例。
示例
有关如何使用周期的示例,请参阅 example/*
。