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 删除cookie和浏览器重定向
Mar 16 PHP
基于pear auth实现登录验证
Feb 26 PHP
php下使用SimpleXML 处理XML 文件
Feb 27 PHP
php curl常见错误:SSL错误、bool(false)
Dec 28 PHP
php生成短网址示例
May 05 PHP
php中curl、fsocket、file_get_content三个函数的使用比较
May 09 PHP
ThinkPHP中处理表单中的注意事项
Nov 22 PHP
php面向对象中static静态属性与方法的内存位置分析
Feb 08 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
PHP实现微信对账单处理
Oct 01 PHP
laravel 自定义常量的两种方案
Oct 14 PHP
PHP安全之register_globals的on和off的区别
Jul 23 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
实现树状结构的两种方法
2006/10/09 PHP
PHP 获取远程文件大小的3种解决方法
2013/07/11 PHP
thinkphp连贯操作实例分析
2014/11/22 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
JavaScript 基础知识 被自己遗忘的
2009/10/15 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
JavaScript中的迭代器和生成器详解
2014/10/29 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
利用jquery实现实时更新歌词的方法
2017/01/06 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
了解javascript中变量及函数的提升
2019/05/27 Javascript
玩转python爬虫之URLError异常处理
2016/02/17 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
Python sorted函数详解(高级篇)
2018/09/18 Python
对Python中内置异常层次结构详解
2018/10/18 Python
Python3.5文件修改操作实例分析
2019/05/01 Python
基于Python fminunc 的替代方法
2020/02/29 Python
Django用数据库表反向生成models类知识点详解
2020/03/25 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
迪卡侬荷兰官网:Decathlon荷兰
2017/10/29 全球购物
台湾SHOPRO购物行家:亚洲首创影视.3C.家电.优质购物平台
2018/05/07 全球购物
德国圣伯纳德草药屋:Kräuterhaus Sanct Bernhard(有中文站)
2018/08/05 全球购物
SmartBuyGlasses意大利:购买太阳镜、眼镜和隐形眼镜
2018/11/20 全球购物
教师岗位职责
2013/11/17 职场文书
学习保证书范文
2014/04/30 职场文书
环境保护标语
2014/06/20 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
天坛导游词
2015/02/02 职场文书
和谐拯救危机观后感
2015/06/15 职场文书
爱国主义电影观后感
2015/06/18 职场文书
python四种出行路线规划的实现
2021/06/23 Python