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 相关文章推荐
Win9x/ME下Apache+PHP安装配置
Oct 09 PHP
关于php curl获取301或302转向的网址问题的解决方法
Jun 02 PHP
ThinkPHP3.1新特性之G方法的使用
Jun 19 PHP
PHP ignore_user_abort函数详细介绍和使用实例
Jul 15 PHP
php5.4以下版本json不支持不转义内容中文的解决方法
Jan 13 PHP
php根据某字段对多维数组进行排序的方法
Mar 07 PHP
PHP实现通用alert函数的方法
Mar 11 PHP
PHP中应该避免使用同名变量(拆分临时变量)
Apr 03 PHP
[原创]php逐行读取txt文件写入数组的方法
Jul 02 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
Mar 21 PHP
php导出csv文件,可导出前导0实例代码
Nov 16 PHP
php获取访问者浏览页面的浏览器类型
Jan 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
计算2000年01月01日起到指定日的天数
2006/10/09 PHP
PR值查询 | PageRank 查询
2006/12/20 PHP
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
2008/03/28 PHP
使用PHP导出Redis数据到另一个Redis中的代码
2014/03/12 PHP
PHPMailer发送邮件
2016/12/28 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
Javascript调用C#代码
2011/01/17 Javascript
js事件(Event)知识整理
2012/10/11 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
html文本框提示效果的示例代码
2014/06/28 Javascript
javascript在IE下trim函数无法使用的解决方法
2014/09/12 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
Angular 页面跳转时传参问题
2016/08/01 Javascript
几句话带你理解JS中的this、闭包、原型链
2016/09/26 Javascript
jquery实现弹窗功能(窗口居中显示)
2017/02/27 Javascript
深入理解Vue transition源码分析
2017/07/30 Javascript
微信小程序自定义toast的实现代码
2018/11/16 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
在Django的视图中使用form对象的方法
2015/07/18 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
Python使用re模块实现信息筛选的方法
2018/04/29 Python
python实现zabbix发送短信脚本
2018/09/17 Python
python实现大文本文件分割
2019/07/22 Python
python 多进程共享全局变量之Manager()详解
2019/08/15 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
python:删除离群值操作(每一行为一类数据)
2020/06/08 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
澳大利亚汽车零部件、音响及配件超市:Automotive Superstore
2018/06/19 全球购物
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
品质管理部岗位职责范文
2014/03/01 职场文书
名人演讲稿范文
2014/09/16 职场文书
户籍证明模板
2014/09/28 职场文书
刑事撤诉申请书
2015/05/18 职场文书
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫