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 相关文章推荐
在WAMP环境下搭建ZendDebugger php调试工具的方法
Jul 18 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
Sep 23 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
Jun 09 PHP
PHP实现绘制3D扇形统计图及图片缩放实例
Oct 01 PHP
9段PHP实用功能的代码推荐
Oct 14 PHP
php实现汉字验证码和算式验证码的方法
Mar 07 PHP
[原创]php获取数组中键值最大数组项的索引值
Mar 17 PHP
WordPress开发中的get_post_custom()函数使用解析
Jan 04 PHP
详解PHP的Yii框架中自带的前端资源包的使用
Mar 31 PHP
Joomla简单判断用户是否登录的方法
May 04 PHP
php实现将HTML页面转换成word并且保存的方法
Oct 14 PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
PHP函数常用用法小结
2010/02/08 PHP
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
2010/03/21 PHP
php 获取一个月第一天与最后一天的代码
2010/05/16 PHP
php 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
用PHP的反射实现委托模式的讲解
2019/03/22 PHP
认识延迟时间为0的setTimeout
2008/05/16 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
jquery获得页面元素的坐标值实现思路及代码
2013/04/15 Javascript
浅谈javascript六种数据类型以及特殊注意点
2013/12/20 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
2013/12/31 Javascript
详解JS函数重载
2014/12/04 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
web 屏蔽BackSpace键实例代码
2016/12/24 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
2018/09/30 Javascript
对 Vue-Router 进行单元测试的方法
2018/11/05 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
微信小程序可滑动周日历组件使用详解
2019/10/21 Javascript
[08:38]DOTA2-DPC中国联赛 正赛 VG vs Elephant 选手采访
2021/03/11 DOTA
浅谈Tensorflow模型的保存与恢复加载
2018/04/26 Python
使用Python实现微信提醒备忘录功能
2018/12/04 Python
python3实现多线程聊天室
2018/12/12 Python
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
python包的导入方式总结
2021/03/02 Python
html5教程画矩形代码分享
2013/12/04 HTML / CSS
html5调用app分享功能示例(WebViewJavascriptBridge)
2018/03/21 HTML / CSS
瑞士设计师家具和家居饰品网上商店:Bruno Wickart
2019/03/18 全球购物
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
新手初学Java网络编程
2021/07/07 Java/Android
Python日志模块logging用法
2022/06/05 Python