oranfry/periods

此包最新版本(1.1.3)没有提供许可证信息。

1.1.3 2024-08-23 22:09 UTC

This package is auto-updated.

Last update: 2024-09-23 22:22:52 UTC


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/*