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获得当前的脚本网址
Dec 10 PHP
PHP HTML代码串 截取实现代码
Jun 29 PHP
PHP 用数组降低程序的时间复杂度
Dec 04 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
Sep 05 PHP
PHP中的socket_read和socket_recv区别详解
Feb 09 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
PHP加密解密类实例代码
Jul 20 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
Apr 05 PHP
PHP实现Unicode编码相互转换的方法示例
Nov 17 PHP
PHP+jQuery实现即点即改功能示例
Feb 21 PHP
php连接mysql数据库最简单的实现方法
Sep 24 PHP
PHP实现简单用户登录界面
Oct 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
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
php实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
2016/04/07 PHP
ThinkPHP中where()使用方法详解
2016/04/19 PHP
tp5.1 实现setInc字段自动加1
2019/10/18 PHP
PHP 出现 http500 错误的解决方法
2021/03/09 PHP
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
JS实现的简洁二级导航菜单雏形效果
2015/10/13 Javascript
JavaScript必看小技巧(必看)
2016/06/07 Javascript
JS简单判断滚动条的滚动方向实现方法
2017/04/28 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
微信小程序swiper左右扩展各显示一半代码实例
2019/12/05 Javascript
Vue使用screenfull实现全屏效果
2020/09/17 Javascript
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
Python文档生成工具pydoc使用介绍
2015/06/02 Python
Windows下安装Scrapy
2018/10/17 Python
Python使用post及get方式提交数据的实例
2019/01/24 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
Python Matplotlib实现三维数据的散点图绘制
2019/03/19 Python
Python 堆叠柱状图绘制方法
2019/07/29 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
Python 变量的创建过程详解
2019/09/02 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
keras 解决加载lstm+crf模型出错的问题
2020/06/10 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
力学专业毕业生自荐信
2013/11/17 职场文书
校长岗位职责
2013/11/26 职场文书
法人任命书范本
2014/06/04 职场文书
第一军规观后感
2015/06/12 职场文书
2016先进工作者事迹材料
2016/02/25 职场文书
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android