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 相关文章推荐
ThinkPHP采用模块和操作分析
Apr 18 PHP
设置php页面编码的两种方法示例介绍
Mar 03 PHP
PHP封装CURL扩展类实例
Jul 28 PHP
php简单防盗链实现方法
Jul 29 PHP
PHP工程师VIM配置分享
Dec 15 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
Mar 25 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
Apr 23 PHP
总结PHP删除字符串最后一个字符的三种方法
Aug 30 PHP
THinkPHP获取客户端IP与IP地址查询的方法
Nov 14 PHP
php格式化时间戳
Dec 17 PHP
PHP实现的多维数组排序算法分析
Feb 10 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
Aug 03 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懒人函数 自动添加数据
2011/06/28 PHP
PHP Session机制简介及用法
2014/08/19 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
2019/10/12 PHP
div层的移动及性能优化
2010/11/16 Javascript
jquery和ajax的关系详细介绍
2013/11/29 Javascript
在Firefox下js select标签点击无法弹出
2014/03/06 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
2016/01/28 Javascript
判断数组的最佳方法(推荐)
2016/10/11 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
2019/05/10 Javascript
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
js 获取扫码枪输入数据的方法
2020/06/10 Javascript
[02:23]2018DOTA2亚洲邀请赛趣味视频——反应测试
2018/04/04 DOTA
深入理解python try异常处理机制
2016/06/01 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
python3 requests中使用ip代理池随机生成ip的实例
2018/05/07 Python
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
python PrettyTable模块的安装与简单应用
2019/01/11 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
spyder 在控制台(console)执行python文件,debug python程序方式
2020/04/20 Python
详解Python IO口多路复用
2020/06/17 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
HTML5实现可缩放时钟代码
2017/08/28 HTML / CSS
马来西亚网上购物平台:ezbuy
2018/02/13 全球购物
Huda Beauty官方商店:化妆和美容产品
2020/09/05 全球购物
生物制药毕业生自荐信
2013/10/16 职场文书
2014信息技术专业毕业生自我评价
2014/01/17 职场文书
静心口服夜广告词
2014/03/20 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
法人委托书范本
2014/09/15 职场文书
基层党组织整改方案
2014/10/25 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书
大学生暑期实践报告之企业经营管理
2019/08/08 职场文书
Javascript中Microtask和Macrotask鲜为人知的知识点
2022/04/02 Javascript