在最近的一个物联网项目中用到了日程计划安排和定时提醒功能,为了这单一的一个小功能,波波开发了很多时间日期的组合运算方法。等项目完毕有时间了再一一记录。
我们首先看下日程的数据保存格式:
- @test:{"type":"month","cycle_type":"day","gap":"1","day":"2","begin_time":"12:00","title":"\u6bcf1\u6708\u91cd\u590d,\u7b2c2\u592912:00\u6267\u884c"}
而日程功能的页面组合也是非常之多。
单单一个小表单组合出来的计算类型就多达10种。开发这功能也是日了狗了。
话不多说,在以年为单位,按周计算的计划中就用到需要计算未来某年某月某周星期几的时间戳。我的思路是先计算未来的月份,然后获取该月份的星期安排,根据未来月份的星期信息获取到未来某月某周星期几对应的日期,然后再计算出时间戳,或直接返回字符串的日期。
看上边文字就感觉到非常的绕吧?下面分享的代码片段是计算未来某年某月某周的星期安排的。在月初或月末会遇到跨月份的星期。我的处理方法是把上下月的日期计算入本月的第几周内。
源码:
- /*
- * 计算某一年某个月有几周
- * @param $month string 年月
- * @return array
- */
- function get_weekinfo($month){
- $weekinfo = [];
- $end_date = date('d',strtotime($month.' +1 month -1 day'));//计算当前月有多少天
- for ($i=1; $i <$end_date ; $i=$i+7) {
- $w = date('N',strtotime($month.'-'.$i));
- $weekinfo[] = array(date('Y-m-d',strtotime($month.'-'.$i.' -'.($w-1).' days')),date('Y-m-d',strtotime($month.'-'.$i.' +'.(7-$w).' days')));
- }
- foreach($weekinfo as $key=>$value){
- $enddate = $value[1];
- unset($weekinfo[$key][1]);
- for($i=1;$i<7;$i++){
- array_push($weekinfo[$key],date('Y-m-d',strtotime($value[0].'+'.$i.' days')));
- }
- array_push($weekinfo[$key],$enddate);
- }
- return $weekinfo;
- }
返回数据示例:
在返回数组中0代表周一,7代表周日。第几周星期几就可以直接取数组的值了。