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 相关文章推荐
Array of country list in PHP with Zend Framework
Oct 17 PHP
PHP采集腾讯微博的实现代码
Jan 19 PHP
PHP ignore_user_abort函数详细介绍和使用实例
Jul 15 PHP
PHP依赖倒置(Dependency Injection)代码实例
Oct 11 PHP
PHP防止注入攻击实例分析
Nov 03 PHP
smarty简单入门实例
Nov 28 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
Jul 21 PHP
Symfony2实现在doctrine中内置数据的方法
Feb 05 PHP
yii2 页面底部加载css和js的技巧
Apr 21 PHP
smarty循环嵌套用法示例分析
Jul 19 PHP
PHP树形结构tree类用法示例
Feb 01 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
Oct 01 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中使用Oracle数据库(6)
2006/10/09 PHP
php获得文件扩展名三法
2006/11/25 PHP
php封装的mongodb操作类代码
2017/08/06 PHP
PHP7新功能总结
2019/04/14 PHP
PHP基于openssl实现非对称加密代码实例
2020/06/19 PHP
jquery实现点击消失的代码
2014/03/03 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
本人自用的global.js库源码分享
2015/02/28 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
javascript单例模式的简单实现方法
2015/07/25 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
2015/09/30 Javascript
浅析Vue 和微信小程序的区别、比较
2018/08/03 Javascript
关于node-bindings无法在Electron中使用的解决办法
2018/12/18 Javascript
基于vue如何发布一个npm包的方法步骤
2019/05/15 Javascript
全面分析JavaScript 继承
2019/05/30 Javascript
layui实现三级联动效果
2019/07/26 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
Nuxt页面级缓存的实现
2020/03/09 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
2017/11/01 Python
python 分离文件名和路径以及分离文件名和后缀的方法
2018/10/21 Python
分享8个非常流行的 Python 可视化工具包
2019/06/05 Python
wxpython绘制圆角窗体
2019/11/18 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
Python如何省略括号方法详解
2020/03/21 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
瑞典网上购买现代和复古家具:Reforma
2019/10/21 全球购物
应届生体育教师自荐信
2013/10/03 职场文书
党员创先争优公开承诺书
2014/03/28 职场文书
优秀实习生主要事迹
2014/05/29 职场文书
超市开业庆典活动策划方案
2014/09/15 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书
python实现监听键盘
2021/04/26 Python