在Discuz插件开发中,获取特定时间段的起止时间是一个常见的需求,尤其是在处理排行榜、计划任务等功能时。你提供的代码片段已经很好地展示了如何使用PHP的`date()`和`mktime()`函数来获取今天、上周、本周、上月、本月、本季度和上季度的起止时间。下面我将对这些代码进行一些解释和优化,以便更好地理解和使用。
### 1. 设置时区
- date_default_timezone_set('PRC');
复制代码
这行代码将时区设置为中国时区(PRC),确保时间计算基于中国的时间。
### 2. 获取今天的时间范围
- echo '今天:';
- echo date("Y-m-d H:i:s", mktime(0, 0, 0, date("m"), date("d"), date("Y"))), "\n";
- echo date("Y-m-d H:i:s", mktime(23, 59, 59, date("m"), date("d"), date("Y"))), "\n";
复制代码
- `mktime(0, 0, 0, date("m"), date("d"), date("Y"))` 获取今天的开始时间(00:00:00)。
- `mktime(23, 59, 59, date("m"), date("d"), date("Y"))` 获取今天的结束时间(23:59:59)。
### 3. 获取上周的时间范围
- echo '上周:';
- echo date("Y-m-d H:i:s", mktime(0, 0, 0, date("m"), date("d") - date("w") + 1 - 7, date("Y"))), "\n";
- echo date("Y-m-d H:i:s", mktime(23, 59, 59, date("m"), date("d") - date("w") + 7 - 7, date("Y"))), "\n";
复制代码
- `date("d") - date("w") + 1 - 7` 计算上周的周一的日期。
- `date("d") - date("w") + 7 - 7` 计算上周的周日的日期。
### 4. 获取本周的时间范围
- echo '本周:';
- echo date("Y-m-d H:i:s", mktime(0, 0, 0, date("m"), date("d") - date("w") + 1, date("Y"))), "\n";
- echo date("Y-m-d H:i:s", mktime(23, 59, 59, date("m"), date("d") - date("w") + 7, date("Y"))), "\n";
复制代码
- `date("d") - date("w") + 1` 计算本周的周一的日期。
- `date("d") - date("w") + 7` 计算本周的周日的日期。
### 5. 获取上月的时间范围
- echo '上月:';
- echo date("Y-m-d H:i:s", mktime(0, 0, 0, date("m") - 1, 1, date("Y"))), "\n";
- echo date("Y-m-d H:i:s", mktime(23, 59, 59, date("m"), 0, date("Y"))), "\n";
复制代码
- `mktime(0, 0, 0, date("m") - 1, 1, date("Y"))` 获取上月的第一天。
- `mktime(23, 59, 59, date("m"), 0, date("Y"))` 获取上月的最后一天。
### 6. 获取本月的时间范围
- echo '本月:';
- echo date("Y-m-d H:i:s", mktime(0, 0, 0, date("m"), 1, date("Y"))), "\n";
- echo date("Y-m-d H:i:s", mktime(23, 59, 59, date("m"), date("t"), date("Y"))), "\n";
复制代码
- `mktime(0, 0, 0, date("m"), 1, date("Y"))` 获取本月的第一天。
- `mktime(23, 59, 59, date("m"), date("t"), date("Y"))` 获取本月的最后一天。
### 7. 获取本季度的时间范围
- $season = ceil((date('n')) / 3); // 当月是第几季度
- echo '本季度:';
- echo date('Y-m-d H:i:s', mktime(0, 0, 0, $season * 3 - 3 + 1, 1, date('Y'))), "\n";
- echo date('Y-m-d H:i:s', mktime(23, 59, 59, $season * 3, date('t', mktime(0, 0, 0, $season * 3, 1, date("Y"))), date('Y'))), "\n";
复制代码
- `ceil((date('n')) / 3)` 计算当前月份所在的季度。
- `mktime(0, 0, 0, $season * 3 - 3 + 1, 1, date('Y'))` 获取本季度的第一天。
- `mktime(23, 59, 59, $season * 3, date('t', mktime(0, 0, 0, $season * 3, 1, date("Y"))), date('Y'))` 获取本季度的最后一天。
### 8. 获取上季度的时间范围
- $season = ceil((date('n')) / 3) - 1; // 上季度是第几季度
- echo '上季度:';
- echo date('Y-m-d H:i:s', mktime(0, 0, 0, $season * 3 - 3 + 1, 1, date('Y'))), "\n";
- echo date('Y-m-d H:i:s', mktime(23, 59, 59, $season * 3, date('t', mktime(0, 0, 0, $season * 3, 1, date("Y"))), date('Y'))), "\n";
复制代码
- `ceil((date('n')) / 3) - 1` 计算上一个季度。
- `mktime(0, 0, 0, $season * 3 - 3 + 1, 1, date('Y'))` 获取上季度的第一天。
- `mktime(23, 59, 59, $season * 3, date('t', mktime(0, 0, 0, $season * 3, 1, date("Y"))), date('Y'))` 获取上季度的最后一天。
### 总结
这段代码非常实用,尤其是在处理时间相关的业务逻辑时。你可以根据需要将这些代码片段封装成函数,方便在插件中调用。例如:
- function getTodayRange() {
- return [
- 'start' => date("Y-m-d H:i:s", mktime(0, 0, 0, date("m"), date("d"), date("Y"))),
- 'end' => date("Y-m-d H:i:s", mktime(23, 59, 59, date("m"), date("d"), date("Y")))
- ];
- }
- // 其他时间段的函数类似...
复制代码
这样,你可以通过调用`getTodayRange()`等函数来获取不同时间段的起止时间,代码会更加简洁和易于维护。
如果你有更多关于Discuz插件开发的问题,欢迎随时提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |