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实现ping
Oct 09 PHP
如何使用脚本模仿登陆过程
Nov 22 PHP
ExtJS与PHP、MySQL实现存储的方法
Apr 02 PHP
php中对2个数组相加的函数
Jun 24 PHP
php入门之连接mysql数据库的一个类
Apr 21 PHP
Apache中php.ini的设置方法
Feb 28 PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
Jan 30 PHP
双冒号 ::在PHP中的使用情况
Nov 05 PHP
详解php设置session(过期、失效、有效期)
Nov 12 PHP
关于PHP文件的自动运行方法分析
May 13 PHP
php删除一个路径下的所有文件夹和文件的方法
Feb 07 PHP
YII框架实现自定义第三方扩展操作示例
Apr 26 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
PHP中MD5函数使用实例代码
2008/06/07 PHP
PHP禁止个别IP访问网站
2013/10/30 PHP
php获取表单中多个同名input元素的值
2014/03/20 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
PHP过滤黑名单关键字的方法
2014/12/01 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
2017/06/09 PHP
PHP安装BCMath扩展的方法
2019/02/13 PHP
在线编辑器的实现原理(兼容IE和FireFox)
2007/03/09 Javascript
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
javascript 函数使用说明
2010/04/07 Javascript
jQuery多级手风琴菜单实例讲解
2015/10/22 Javascript
BootStrap中Tab页签切换实例代码
2016/05/30 Javascript
JavaScript继承与多继承实例分析
2018/05/26 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
javascript中可能用得到的全部的排序算法
2020/03/05 Javascript
Element Rate 评分的使用方法
2020/07/27 Javascript
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
python实现从字典中删除元素的方法
2015/05/04 Python
从django的中间件直接返回请求的方法
2018/05/30 Python
pandas的唯一值、值计数以及成员资格的示例
2018/07/25 Python
Python 图片处理库exifread详解
2021/02/25 Python
突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习
2013/01/31 HTML / CSS
巴西女装购物网站:Eclectic
2018/04/24 全球购物
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
递归计算如下递归函数的值(斐波拉契)
2012/02/04 面试题
活动志愿者自荐信
2014/01/27 职场文书
工商干部先进事迹
2014/05/14 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
2015年财政局工作总结
2015/05/21 职场文书
民间借贷借条范本
2015/05/25 职场文书
大学运动会通讯稿
2015/07/18 职场文书