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 木马攻击防御技巧
Jun 13 PHP
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
Jul 01 PHP
php str_pad 函数用法简介
Jul 11 PHP
用PHP ob_start()控制浏览器cache、生成html实现代码
Feb 16 PHP
php skymvc 一款轻量、简单的php
Jun 28 PHP
web目录下不应该存在多余的程序(安全考虑)
May 09 PHP
php的POSIX 函数以及进程测试的深入分析
Jun 03 PHP
php include和require的区别深入解析
Jun 17 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
Apr 04 PHP
完美解决phpdoc导出文档中@package的warning及Error的错误
May 17 PHP
一个简单安全的PHP验证码类 附调用方法
Jun 24 PHP
PHP 等比例缩放图片详解及实例代码
Sep 18 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新手上路(二)
2006/10/09 PHP
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
PHP7数组的底层实现示例
2019/08/25 PHP
php让json_encode不自动转义斜杠“/”的方法
2020/04/27 PHP
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
在浏览器中获取当前执行的脚本文件名的代码
2011/07/19 Javascript
js图片预加载示例
2014/04/30 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
深入浅析vue组件间事件传递
2017/12/29 Javascript
基于vue开发的在线付费课程应用过程
2018/01/25 Javascript
微信小程序模版渲染详解
2018/01/26 Javascript
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
Python中的字符串类型基本知识学习教程
2016/02/04 Python
Python实现PS图像调整颜色梯度效果示例
2018/01/25 Python
Python利用公共键如何对字典列表进行排序详解
2018/05/19 Python
Python识别html主要文本框过程解析
2020/02/18 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
什么是会话Bean
2015/05/14 面试题
软件工程专业推荐信
2013/10/28 职场文书
安全技术说明书
2014/05/09 职场文书
2015幼儿园庆元旦活动方案
2014/12/09 职场文书
计划生育目标责任书
2015/05/09 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
大学运动会加油稿
2015/07/22 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书
python获取字符串中的email
2022/03/31 Python
TV动画《八十龟酱观察日记》第四季宣传PV公布
2022/04/06 日漫