仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 6611|回复: 20

[学习教程] PHP编程:两个日期类

[复制链接]
兰色精灵 该用户已被删除
发表于 2015-2-16 00:28:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
建议大家买一本书,而不光是在网上看一些零碎的资料,一本书毕竟会讲的系统一些,全面一些,而且印刷的书不受电脑的限制,但是建议在看书的时候最好旁边有电脑,这样可以很及时地上机实践。   <?
/**
  这是公历和夏历类的界说,因为php的日期盘算限制,所以只能盘算1970-1938之间的工夫
  夏历类的盘算办法利用了林洵贤师长教师的算法,在此暗示感激!在joy Asp可以找到林师长教师的高文(javascript)
*/

/**
* 日期类
* 本对象套用JavaScript的日期对象的办法
* 设置$mode属性,可兼容JavaScript日期对象
*/
class Date {
  var $time = 0;
  var $mode = 0;  // 本属性为与JavaScript兼容而设,$mode=1为JavaScript体例
  var $datemode = "Y-m-d H:i:s";  // 日期格局 "Y-m-d H:i:s",可自行设定
  function Date($t=0) {
    if($t == 0)
      $this->time = time();
  }
  /**
   * 前往从GMT工夫1970年1月1日0时入手下手的毫秒数
   */
  function getTime() {
    $temp = gettimeofday();
    return $temp[sec]*1000+round($temp[usec]/1000);
  }
  /**
   * 前往年份
   */
  function getYear() {
    $temp = getdate($this->time);
    return $temp[year];
  }
  /**
   * 前往月份
   */
  function getMonth() {
    $temp = getdate($this->time);
    return $temp[mon]-$this->mode;
  }
  /**
   * 前往日期
   */
  function getDate() {
    $temp = getdate($this->time);
    return $temp[mday];
  }
  /**
   * 前往礼拜
   */
  function getDay() {
    $temp = getdate($this->time);
    return $temp[wday]-$this->mode;
  }
  /**
   * 前往小时
   */
  function getHours() {
    $temp = getdate($this->time);
    return $temp[hours];
  }
  /**
   * 前往分
   */
  function getMinutes() {
    $temp = getdate($this->time);
    return $temp[minutes];
  }
  /**
   * 前往秒
   */
  function getSeconds() {
    $temp = getdate($this->time);
    return $temp[seconds];
  }
  /**
   * 设定年份
   * php 4.0.6 year 1970 -- 2038
   */
  function setYear($val) {
    $temp = getdate($this->time);
    $temp[year] = $val;
    $this->set_time($temp);
  }
  /**
   * 设定月份
   */
  function setMonth($val) {
    $temp = getdate($this->time);
    $temp[mon] = $val+$this->mode;
    $this->set_time($temp);
  }
  /**
   * 设定日期
   */
  function setDate($val) {
    $temp = getdate($this->time);
    $temp[mday] = $val;
    $this->set_time($temp);
  }
  /**
   * 设定礼拜
   */
  function setDay($val) {
    $temp = getdate($this->time);
    $temp[wday] = $val+$this->mode;
    $this->set_time($temp);
  }
  /**
   * 设定小时
   */
  function setHours($val) {
    $temp = getdate($this->time);
    $temp[hours] = $val;
    $this->set_time($temp);
  }
  /**
   * 设定分
   */
  function setMinutes($val) {
    $temp = getdate($this->time);
    $temp[minutes] = $val;
    $this->set_time($temp);
  }
  /**
   * 设定秒
   */
  function setSeconds($val) {
    $temp = getdate($this->time);
    $temp[seconds] = $val;
    $this->set_time($temp);
  }
  /**
   * 前往体系格局的字符串
   */
  function toLocaleString() {
    return date($this->datemode,$this->time);
  }
  /**
   * 利用GTM工夫创立一个日期值
   */
  function UTC($year,$mon,$mday,$hours=0,$minutes=0,$seconds=0) {
    $this->time = mktime($hours,$minutes,$seconds,$mon,$mday,$year);
    return $this->time;
  }
  /**
   * 等价于DateAdd(interval,number,date)
   * 前往已添加指准时间距离的日期。
   * Inetrval为暗示要添加的工夫距离字符串表达式,例如分或天
   * number为暗示要添加的工夫距离的个数的数值表达式
   * Date暗示日期
   *
   * Interval(工夫距离字符串表达式)可所以以下恣意值:
   *  yyyy year年
   *  q Quarter季度
   *  m Month月
   *  y Day of year一年的数
   *  d Day天
   *  w Weekday一周的天数
   *  ww Week of year周
   *  h Hour小时
   *  n Minute分
   *  s Second秒
   *  w、y和d的感化是完整一样的,即在今朝的日期上加一天,q加3个月,ww加7天。
   */
  function Add($interval, $number, $date) {
    $date = Date::get_time($date);
    $date_time_array = getdate($date);
    $hours = $date_time_array["hours"];
    $minutes = $date_time_array["minutes"];
    $seconds = $date_time_array["seconds"];
    $month = $date_time_array["mon"];
    $day = $date_time_array["mday"];
    $year = $date_time_array["year"];
    switch ($interval) {
      case "yyyy": $year +=$number; break;
      case "q": $month +=($number*3); break;
      case "m": $month +=$number; break;
      case "y":
      case "d":
      case "w": $day+=$number; break;
      case "ww": $day+=($number*7); break;
      case "h": $hours+=$number; break;
      case "n": $minutes+=$number; break;
      case "s": $seconds+=$number; break;
    }
    $temptime = mktime($hours ,$minutes, $seconds,$month ,$day, $year);
    return $temptime;
  }
  /**
   * 等价于DateDiff(interval,date1,date2)
   * 前往两个日期之间的工夫距离
   * intervals(工夫距离字符串表达式)可所以以下恣意值:
   *   w  周
   *   d  天
   *   h  小时
   *   n  分钟
   *   s  秒
   */
  function Diff($interval, $date1,$date2) {
    // 失掉两日期之间距离的秒数
    $timedifference = Date::get_time($date2) - Date::get_time($date1);
    switch ($interval) {
      case "w": $retval = bcdiv($timedifference ,604800); break;
      case "d": $retval = bcdiv( $timedifference,86400); break;
      case "h": $retval = bcdiv ($timedifference,3600); break;
      case "n": $retval = bcdiv( $timedifference,60); break;
      case "s": $retval = $timedifference; break;
    }
    return $retval;
  }

  /**
   * 输入,依据需求直接修正本函数或在派生类中重写本函数
   */
  function display() {
    $nStr = array('日','一','二','三','四','五','六');
    echo sprintf("%4d年%2d月%2d日 礼拜%s<br>",$this->getYear(),$this->getMonth(),$this->getDate(),$nStr[$this->getDay()%7]);
  }
  /**
   * 任务函数
   */
  function set_time(&$ar) {
    $this->time = mktime($ar[hours],$ar[minutes],$ar[seconds],$ar[mon],$ar[mday],$ar[year]);
  }
  /**
   * 转换为UNIX工夫戳
   */
  function get_time($d) {
    if(is_numeric($d))
      return $d;
    else {
      if(! is_string($d)) return 0;
      if(ereg(":",$d)) {
        $buf = split(" +",$d);
        $year = split("[-/]",$buf[0]);
        $hour = split(":",$buf[1]);
        if(eregi("pm",$buf[2]))
          $hour[0] += 12;
        return mktime($hour[0],$hour[1],$hour[2],$year[1],$year[2],$year[0]);
      }else {
        $year = split("[-/]",$d);
        return mktime(0,0,0,$year[1],$year[2],$year[0]);
      }
    }
  }
} // 日期类界说停止
?>

<?
/**
* 夏历类
*/
class Lunar {
  var $year;
  var $month;
  var $day;
  var $isLeap;
  var $yearCyl;
  var $dayCyl;
  var $monCyl;
  var $time;
  var $lunarInfo = array(
    0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,
    0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,
    0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,
    0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,
    0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,
    0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,0x14573,0x052d0,0x0a9a8,0x0e950,0x06aa0,
    0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,
    0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,0x195a6,
    0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,
    0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,
    0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,
    0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,
    0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,
    0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,
    0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,
    0x14b63);

  /**
   * 传回夏历 y年的总天数
   */
  function lYearDays($y) {
    $sum = 348;
    for($i=0x8000; $i>0x8; $i>>=1)
      $sum += ($this->lunarInfo[$y-1900] & $i)? 1: 0;
    return $sum+$this->leapDays($y);
  }
  /**
   * 传回夏历 y年闰月的天数
   */
  function leapDays($y) {
    if($this->leapMonth($y))
      return ($this->lunarInfo[$y-1900] & 0x10000)? 30: 29;
    else return 0;
  }
  /**
   * 传回夏历 y年闰哪一个月 1-12 , 没闰传回 0
   */
  function leapMonth($y) {
    return $this->lunarInfo[$y-1900] & 0xf;
  }
  /**
   * 传回夏历 y年m月的总天数
   */
  function monthDays($y,$m) {
    return ($this->lunarInfo[$y-1900] & (0x10000>>$m))? 30: 29;
  }
  /**
   * 创立夏历日期对象
   */
  function Lunar($objDate,$month=1,$day=1) {
    $leap=0;
    $temp=0;
    if(is_object($objDate))
      $this->time = mktime(0,0,0,$objDate->getMonth(),$objDate->getDate(),$objDate->getYear());
    else {
      $year = $objDate;
      $this->time = mktime(0,0,0,$month,$day,$year);
      if($year < 1970) {
        return;
        $temp = 0;
        for($i=1970; $i>$year; $i--) {
          $temp = $this->lYearDays($i);
          $offset -= $temp;
        }
      }
    }
    $offset = round($this->time/86400+25537);

    $this->dayCyl = $offset + 40;
    $this->monCyl = 14;

    for($i=1900; $i<$year && $offset>0; $i++) {
      $temp = $this->lYearDays($i);
      $offset -= $temp;
      $this->monCyl += 12;
    }

    if($offset<0) {
      $offset += $temp;
      $i--;
      $this->monCyl -= 12;
    }

    $this->year = $i;
    $this->yearCyl = $i-1864;
    $leap = $this->leapMonth($i); //闰哪一个月

    $this->isLeap = false;
    for($i=1; $i<13 && $offset>0; $i++) {
      //闰月
      if($leap>0 && $i==($leap+1) && $this->isLeap==false) {
        $i--;
        $this->isLeap = true;
        $temp = $this->leapDays($this->year);
      }else {
        $temp = $this->monthDays($this->year, $i);
      }

      //消除闰月
      if($this->isLeap==true && $i==($leap+1))
        $this->isLeap = false;

      $offset -= $temp;
      if($this->isLeap == false)
        $this->monCyl ++;
    }

    if($offset==0 && $leap>0 && $i==$leap+1)
      if($this->isLeap)
        $this->isLeap = false;
      else {
        $this->isLeap = true;
        $i--;
        $this->monCyl--;
      }

    if($offset<0) {
      $offset += $temp;
      $i--;
      $this->monCyl--;
    }

    $this->month = $i;
    $this->day = $offset + 1;
  }

  function cyclical($num) {
    $Gan = Array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");
    $Zhi = Array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥");
    return $Gan[$num%10].$Zhi[$num%12];
  }
  /**
   * 输入,依据需求直接修正本函数或在派生类中重写本函数
   */
  function display() {
    $nStr = array(' ','正','二','三','四','五','六','七','八','九','十','十一','腊');
    echo sprintf("夏历 %s%s月%s<br>",($this->isLeap?"闰":""),$nStr[$this->month],$this->cDay($this->day));
    echo sprintf("%s年 %s月 %s日",$this->cyclical($this->yearCyl),$this->cyclical($this->monCyl),$this->cyclical($this->dayCyl));
  }
  /**
   * 中文日期
   */
  function cDay($d) {
    $nStr1 = array('日','一','二','三','四','五','六','七','八','九','十');
    $nStr2 = array('初','十','廿','卅',' ');

    switch($d) {
      case 10:
        $s = '初十';
        break;
      case 20:
        $s = '二十';
        break;
      case 30:
        $s = '三十';
        break;
      default :
        $s = $nStr2[floor($d/10)];
        $s .= $nStr1[$d%10];
    }
    return $s;
  }
}  // 夏历类界说停止
?>

<?
//  测试例


$d = new Date;
echo "<br>如今是:";
$d->display();

$d->setYear(2037);
echo "<br>如今是:";
echo $d->getYear()."年";
echo $d->getMonth()."月";
echo $d->getDate()."日";
echo " 礼拜".$d->getDay()." ";
echo $d->getHours()."时";
echo $d->getMinutes()."分";
echo $d->getSeconds()."秒<br>";

$d->UTC(1998,10,2,22,0,8);
echo $d->toLocaleString()."<br>";

$d = new Date;
$ld = new Lunar($d);
$d->display();
$ld->display();
$d->UTC(1998,10,2,22,0,8);
$ld = new Lunar($d);
$d->display();
$ld->display();
$ld = new Lunar(2002,2,12);
$ld->display();

echo __LINE__."<BR>";

$d1 = "2002-01-11";
$d2 = date("Y-m-d",$d->add("d",35,$d1));

echo $d1."的". Date::diff("d",$d1,$d2)."天后是$d2<br>";
echo $d1."的10天前是".date("Y-m-d",Date::add("d",-10,$d1))."<br>";
$d3 = date("Y/m/d H:i:s");
echo "如今是".$d3."间隔2002/2/12 12:59:59还有".Date::diff("s",$d3,"2002/2/12 12:59:59")."秒<br>";
?>
  基础这个东西是个比较笼统的概念,如果你之前学习过c语言, c语言被认为是
谁可相欹 该用户已被删除
发表于 2015-2-16 04:50:17 | 显示全部楼层
做为1门年轻的语言,php一直很努力。
小女巫 该用户已被删除
发表于 2015-3-4 23:52:14 | 显示全部楼层
实践是检验自己会不会的真理。
透明 该用户已被删除
发表于 2015-3-11 21:31:19 | 显示全部楼层
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
变相怪杰 该用户已被删除
发表于 2015-3-15 14:34:36 | 显示全部楼层
Ps:以上纯属原创,如有雷同,纯属巧合
灵魂腐蚀 该用户已被删除
发表于 2015-3-22 01:17:14 | 显示全部楼层
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
再现理想 该用户已被删除
发表于 2015-3-27 20:09:38 | 显示全部楼层
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
山那边是海 该用户已被删除
发表于 2015-3-29 18:44:01 | 显示全部楼层
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
兰色精灵 该用户已被删除
 楼主| 发表于 2015-4-1 11:09:59 | 显示全部楼层
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
小魔女 该用户已被删除
发表于 2015-5-6 09:09:37 | 显示全部楼层
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
因胸联盟 该用户已被删除
发表于 2015-6-15 22:48:45 | 显示全部楼层
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
简单生活 该用户已被删除
发表于 2015-7-9 21:15:24 | 显示全部楼层
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
老尸 该用户已被删除
发表于 2015-7-11 22:27:46 | 显示全部楼层
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
若天明 该用户已被删除
发表于 2015-7-20 04:48:17 | 显示全部楼层
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
莫相离 该用户已被删除
发表于 2015-7-22 16:28:22 | 显示全部楼层
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
发表于 2015-7-26 01:59:41 | 显示全部楼层
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
乐观 该用户已被删除
发表于 2015-9-24 08:16:02 | 显示全部楼层
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
爱飞 该用户已被删除
发表于 2015-10-2 00:21:14 | 显示全部楼层
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
第二个灵魂 该用户已被删除
发表于 2015-10-6 11:54:20 | 显示全部楼层
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
飘灵儿 该用户已被删除
发表于 2015-10-14 11:39:10 | 显示全部楼层
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-3-29 16:30

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表