php获取指定日期之间的各个周和月的起止时间


Posted in PHP onNovember 24, 2014

根据指定的前后两个日期,计算这两个日期之间各个周的起始时间和结束时间,以及各个月的起始时间和结束时间

日志格式化类 Date.class.php

<?php

class Datefmt{

   function __construct() {}

  /**

   * 根据指定日期获取所在周的起始时间和结束时间

   */

  public function get_weekinfo_by_date($date) {

    $idx = strftime("%u", strtotime($date));

    $mon_idx = $idx - 1;

    $sun_idx = $idx - 7;

    return array(

      'week_start_day' => strftime('%Y-%m-%d', strtotime($date) - $mon_idx * 86400),

      'week_end_day' => strftime('%Y-%m-%d', strtotime($date) - $sun_idx * 86400),

      );

  }

  /**

   * 根据指定日期获取所在月的起始时间和结束时间

   */

  public function get_monthinfo_by_date($date){

    $ret = array();

    $timestamp = strtotime($date);

    $mdays = date('t', $timestamp);

    return array(

      'month_start_day' => date('Y-m-1', $timestamp),

      'month_end_day' => date('Y-m-'.$mdays, $timestamp)

      );

  }

  /**

   * 获取指定日期之间的各个周

   */

  public function get_weeks($sdate, $edate) {

    $range_arr = array();

    // 检查日期有效性

    $this->check_date(array($sdate, $edate));

    // 计算各个周的起始时间

    do {

      $weekinfo = $this->get_weekinfo_by_date($sdate);

      $end_day = $weekinfo['week_end_day'];

       $start = $this->substr_date($weekinfo['week_start_day']);

      $end = $this->substr_date($weekinfo['week_end_day']);

      $range = "{$start} ~ {$end}";

      $range_arr[] = $range;

       $sdate = date('Y-m-d', strtotime($sdate)+7*86400);

    }while($end_day < $edate);

    return $range_arr;

  }

  /**

  * 获取指定日期之间的各个月

  */

  public function get_months($sdate, $edate) {

    $range_arr = array();

    do {

      $monthinfo = $this->get_monthinfo_by_date($sdate);

      $end_day = $monthinfo['month_end_day'];

       $start = $this->substr_date($monthinfo['month_start_day']);

      $end = $this->substr_date($monthinfo['month_end_day']);

      $range = "{$start} ~ {$end}";

      $range_arr[] = $range;

       $sdate = date('Y-m-d', strtotime($sdate.'+1 month'));

    }while($end_day < $edate);

    return $range_arr;

  }

  /**

   * 截取日期中的月份和日

   * @param string $date

   * @return string $date

   */

  public function substr_date($date) {

    if ( ! $date) return FALSE;

    return date('m-d', strtotime($date));

  }

  /**

  * 检查日期的有效性 YYYY-mm-dd

  * @param array $date_arr

  * @return boolean

  */

  public function check_date($date_arr) {

    $invalid_date_arr = array();

    foreach ($date_arr as $row) {

      $timestamp = strtotime($row);

      $standard = date('Y-m-d', $timestamp);

      if ($standard != $row) $invalid_date_arr[] = $row;

    }

    if ( ! empty($invalid_date_arr)) {

      die("invalid date -> ".print_r($invalid_date_arr, TRUE));

    }

  } 

}

类文件的使用

<?php

    require_once "Datefmt.class.php";

     $datefmt = new Datefmt();

    // 输出11月1日和30日之间的各周

    var_dump($datefmt->get_weeks('2014-11-05', '2014-11-29'));

    /*结果为

    array(4) {

      [0]=>

      string(13) "11-03 ~ 11-09"

      [1]=>

      string(13) "11-10 ~ 11-16"

      [2]=>

      string(13) "11-17 ~ 11-23"

      [3]=>

      string(13) "11-24 ~ 11-30"

    }

    */

    // 输出2月1日和11月30日

    var_dump($datefmt->get_months('2014-02-03', '2014-11-29'));

    /*结果为

    array(10) {

      [0]=>

      string(13) "02-01 ~ 02-28"

      [1]=>

      string(13) "03-01 ~ 03-31"

      [2]=>

      string(13) "04-01 ~ 04-30"

      [3]=>

      string(13) "05-01 ~ 05-31"

      [4]=>

      string(13) "06-01 ~ 06-30"

      [5]=>

      string(13) "07-01 ~ 07-31"

      [6]=>

      string(13) "08-01 ~ 08-31"

      [7]=>

      string(13) "09-01 ~ 09-30"

      [8]=>

      string(13) "10-01 ~ 10-31"

      [9]=>

      string(13) "11-01 ~ 11-30"

    }

    */
PHP 相关文章推荐
修改php.ini以达到屏蔽错误信息并记录日志
Jun 16 PHP
php使用date和strtotime函数输出指定日期的方法
Nov 14 PHP
PHP实现获取FLV文件的时间
Feb 10 PHP
php实现数组中索引关联数据转换成json对象的方法
Jul 08 PHP
php通过两层过滤获取留言内容的方法
Jul 11 PHP
轻松实现php文件上传功能
Feb 17 PHP
PHP让数组中有相同值的组成新的数组实例
Dec 31 PHP
PHP7扩展开发之hello word实现方法详解
Jan 15 PHP
实现PHP中session存储及删除变量
Oct 15 PHP
Laravel基础_关于view共享数据的示例讲解
Oct 14 PHP
简单的php购物车代码
Jun 05 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
Oct 20 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
Nov 24 #PHP
thinkphp判断访客为手机端或PC端的方法
Nov 24 #PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
Nov 24 #PHP
php使用str_replace实现输入框回车替换br的方法
Nov 24 #PHP
thinkphp循环结构用法实例
Nov 24 #PHP
thinkphp特殊标签用法概述
Nov 24 #PHP
PHP中mysql_field_type()函数用法
Nov 24 #PHP
You might like
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
javascript跨域的方法汇总
2015/10/23 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
ionic组件ion-tabs选项卡切换效果实例
2016/08/27 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
2016/11/12 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
2017/02/22 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
微信小程序 实现点击添加移除class
2017/06/12 Javascript
Vue.js在数组中插入重复数据的实现代码
2017/11/17 Javascript
vue2.0 资源文件assets和static的区别详解
2018/04/08 Javascript
javascript 数组精简技巧小结
2020/02/26 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
python多进程实现进程间通信实例
2017/11/24 Python
python实现简单http服务器功能
2018/09/17 Python
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
Python文件常见操作实例分析【读写、遍历】
2018/12/10 Python
python实现求特征选择的信息增益
2018/12/18 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
2019/03/01 Python
PyCharm 无法 import pandas 程序卡住的解决方式
2020/03/09 Python
django xadmin 管理器常用显示设置方式
2020/03/11 Python
在django中实现choices字段获取对应字段值
2020/07/12 Python
详解H5本地储存Web Storage
2017/07/03 HTML / CSS
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
英国在线花园中心:You Garden
2018/06/03 全球购物
泰国网上购物:Shopee泰国
2018/09/14 全球购物
研发工程师的岗位职责
2013/11/18 职场文书
数控专业个人求职信范文
2014/02/05 职场文书
防沙治沙典型材料
2014/05/07 职场文书
做人民满意的公务员活动方案
2014/08/25 职场文书
2014年体育教学工作总结
2014/12/09 职场文书
党员年终个人总结
2015/02/14 职场文书
小学家庭教育心得体会
2016/01/14 职场文书
讲解Python实例练习逆序输出字符串
2022/05/06 Python