php calender(日历)二个版本代码示例(解决2038问题)


Posted in PHP onDecember 24, 2013

php calender(日历)二个版本代码示例(解决2038问题)

注意32位机有2038问题,所以32位服务器的年限范围1970年~2038年

我们还可以使用DateTime来规避这个问题(这样与32位64位无关了)

<?php
/**
 * 
 * 我的日历
 * date_default_timezone_set date mktime
 * @param int $year
 * @param int $month
 * @param string $timezone
 * @author fc_lamp
 * @blog: fc-lamp.blog.163.com
 */
function myCalender($year = '', $month = '', $timezone = 'Asia/Shanghai')
{ date_default_timezone_set ( $timezone );
 $year = abs ( intval ( $year ) );
 $month = abs ( intval ( $month ) );
 //是否是32位机
 if (is32())
 {
  if ($year < 1970 or $year >= 2038)
  {
   $year = date ( 'Y' );
  }
 } else
 {
  if ($year <= 0)
  {
   $year = date ( 'Y' );
  }
 }
 if ($month <= 0 or $month > 12)
 {
  $month = date ( 'm' );
 }
 //上一年
 $pretYear = $year - 1;
 //上一月
 $mpYear = $year;
 $preMonth = $month - 1;
 if ($preMonth <= 0)
 {
  $preMonth = 1;
  $mpYear = $pretYear;
 }
 //下一年
 $nextYear = $year + 1;
 //下一月
 $mnYear = $year;
 $nextMonth = $month + 1;
 if ($nextMonth > 12)
 {
  $nextMonth = 1;
  $mnYear = $nextYear;
 }
 //日历头
 $html = <<<HTML
<table width="500" border="1">
  <tr align="center">
    <td><a href="?y=$pretYear">上一年</a></td>
    <td><a href="?y=$mpYear&m=$preMonth">上一月</a></td>
     <td><a href="?">回到今天</a></td>
    <td><a href="?y=$mnYear&m=$nextMonth">下一月</a></td>
 <td><a href="?y=$nextYear">下一年</a></td>
  </tr>
  <tr align="center">
    <td colspan="5">{$year}年{$month}月</td>
  </tr>
  <tr>
   <td colspan="5">
  <table width="100%" border="1">
   <tr align="center">
    <td style="background-color:#DAF0DD;">星期一</td>
    <td style="background-color:#DAF0DD;">星期二</td>
    <td style="background-color:#DAF0DD;">星期三</td>
    <td style="background-color:#DAF0DD;">星期四</td>
    <td style="background-color:#DAF0DD;">星期五</td>
    <td style="background-color:#F60;color:#fff;font-weight: bold;">星期六</td>
    <td style="background-color:#F60;color:#fff;font-weight: bold;">星期天</td>
   </tr>
HTML;
 $currentDay = date ( 'Y-m-j' );
 //当月最后一天
 $lastday = date ( 'j', mktime ( 0, 0, 0, $nextMonth, 0, $year ) );
 //循环输出天数
 $day = 1;
 $line = '';
 while ( $day <= $lastday )
 {
  $cday = $year . '-' . $month . '-' . $day;
  //当前星期几
  $nowWeek = date ( 'N', mktime ( 0, 0, 0, $month, $day, $year ) );
  if ($day == 1)
  {
   $line = '<tr align="center">';
   $line .= str_repeat ( '<td> </td>', $nowWeek - 1 );
  }
  if ($cday == $currentDay)
  {
   $style = 'style="color:red;"';
  } else
  {
   $style = '';
  }
  $line .= "<td $style>$day</td>";
  //一周结束
  if ($nowWeek == 7)
  {
   $line .= '</tr>';
   $html .= $line;
   $line = '<tr align="center">';
  }
  //全月结束
  if ($day == $lastday)
  {
   if ($nowWeek != 7)
   {
    $line .= str_repeat ( '<td> </td>', 7 - $nowWeek );
   }
   $line .= '</tr>';
   $html .= $line;
   break;
  }
  $day ++;
 }
 $html .= <<<HTML
  </table> 
 </td>
  </tr>
</table>
HTML;
 return $html;
}

/**
 * 
 * 检测是否是32位机
 * @author fc_lamp
 * @blog: fc-lamp.blog.163.com
 */
function is32()
{
 $is32 = False;
 if (strtotime ( '2039-10-10' ) === False)
 {
  $is32 = True;
 }
 return $is32;
}

使用DateTime 类解决2038问题,这样不分32位与64位,代码如下:

<?php
/**
 * 
 * 我的日历(DateTime版本)
 * date_default_timezone_set date mktime
 * @param int $year
 * @param int $month
 * @param string $timezone
 * @author fc_lamp
 * @blog: fc-lamp.blog.163.com
 */
function myCalender($year = '', $month = '', $timezone = 'Asia/Shanghai')
{ date_default_timezone_set ( $timezone );
 $year = abs ( intval ( $year ) );
 $month = abs ( intval ( $month ) );
 $nowDate = new DateTime();
 if ($year <= 0)
 {
  $year = $nowDate->format( 'Y' );
 }
 if ($month <= 0 or $month > 12)
 {
  $month = $nowDate->format('m' );
 }
 //上一年
 $pretYear = $year - 1;
 //上一月
 $mpYear = $year;
 $preMonth = $month - 1;
 if ($preMonth <= 0)
 {
  $preMonth = 1;
  $mpYear = $pretYear;
 }
 //下一年
 $nextYear = $year + 1;
 //下一月
 $mnYear = $year;
 $nextMonth = $month + 1;
 if ($nextMonth > 12)
 {
  $nextMonth = 1;
  $mnYear = $nextYear;
 }
 //日历头
 $html = <<<HTML
<table width="500" border="1">
  <tr align="center">
    <td><a href="?y=$pretYear">上一年</a></td>
    <td><a href="?y=$mpYear&m=$preMonth">上一月</a></td>
     <td><a href="?">回到今天</a></td>
    <td><a href="?y=$mnYear&m=$nextMonth">下一月</a></td>
 <td><a href="?y=$nextYear">下一年</a></td>
  </tr>
  <tr align="center">
    <td colspan="5">{$year}年{$month}月</td>
  </tr>
  <tr>
   <td colspan="5">
  <table width="100%" border="1">
   <tr align="center">
    <td style="background-color:#DAF0DD;">星期一</td>
    <td style="background-color:#DAF0DD;">星期二</td>
    <td style="background-color:#DAF0DD;">星期三</td>
    <td style="background-color:#DAF0DD;">星期四</td>
    <td style="background-color:#DAF0DD;">星期五</td>
    <td style="background-color:#F60;color:#fff;font-weight: bold;">星期六</td>
    <td style="background-color:#F60;color:#fff;font-weight: bold;">星期天</td>
   </tr>
HTML;
 $currentDay = $nowDate->format('Y-m-j' );
 //当月最后一天
 $creatDate = new DateTime("$year-$nextMonth-0");
 $lastday = $creatDate->format('j');
 $creatDate = NULL;
 //循环输出天数
 $day = 1;
 $line = '';
 while ( $day <= $lastday )
 {
  $cday = $year . '-' . $month . '-' . $day;
  //当前星期几
  $creatDate = new DateTime("$year-$month-$day");
  $nowWeek = $creatDate->format('N');
  $creatDate = NULL;
  if ($day == 1)
  {
   $line = '<tr align="center">';
   $line .= str_repeat ( '<td> </td>', $nowWeek - 1 );
  }
  if ($cday == $currentDay)
  {
   $style = 'style="color:red;"';
  } else
  {
   $style = '';
  }
  $line .= "<td $style>$day</td>";
  //一周结束
  if ($nowWeek == 7)
  {
   $line .= '</tr>';
   $html .= $line;
   $line = '<tr align="center">';
  }
  //全月结束
  if ($day == $lastday)
  {
   if ($nowWeek != 7)
   {
    $line .= str_repeat ( '<td> </td>', 7 - $nowWeek );
   }
   $line .= '</tr>';
   $html .= $line;
   break;
  }
  $day ++;
 }
 $html .= <<<HTML
  </table> 
 </td>
  </tr>
</table>
HTML;
 return $html;
}
PHP 相关文章推荐
通过JavaScript或PHP检测Android设备的代码
Mar 09 PHP
php开发留言板的CRUD(增,删,改,查)操作
Apr 19 PHP
PHP5常用函数列表(分享)
Jun 07 PHP
PHP5中GD库生成图形验证码(有汉字)
Jul 28 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
Sep 29 PHP
php array_merge函数使用需要注意的一个问题
Mar 30 PHP
PHP树-不需要递归的实现方法
Jun 21 PHP
PHP laravel中的多对多关系实例详解
Jun 07 PHP
phpcms配置列表页以及获得文章发布时间
Jul 04 PHP
PHP环形链表实现方法示例
Sep 15 PHP
PHP cookie与session会话基本用法实例分析
Nov 18 PHP
PHP解决高并发的优化方案实例
Dec 10 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
Dec 24 #PHP
phpexcel导入excel数据使用方法实例
Dec 24 #PHP
php生成excel列序号代码实例
Dec 24 #PHP
php jquery 多文件上传简单实例
Dec 23 #PHP
php安装xdebug/php安装pear/phpunit详解步骤(图)
Dec 22 #PHP
PHP变量的定义、可变变量、变量引用、销毁方法
Dec 20 #PHP
部署PHP项目应该注意的几点事项分享
Dec 20 #PHP
You might like
《星际争霸重制版》兵种对比图鉴
2020/03/02 星际争霸
程序员编程十条戒律
2009/07/09 PHP
PHP验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
php简单操作mysql数据库的类
2015/04/16 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
JS Map 和 List 的简单实现代码
2013/07/08 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
基于JavaScript实现随机颜色输入框
2016/12/10 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
vue跨域解决方法
2017/10/15 Javascript
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
详解Vue之父子组件传值
2019/04/01 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
利用python将json数据转换为csv格式的方法
2018/03/22 Python
TensorFlow数据输入的方法示例
2018/06/19 Python
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
Python 内存管理机制全面分析
2021/01/16 Python
结合CSS3的布局新特征谈谈常见布局方法
2016/01/22 HTML / CSS
维也纳通行证:Vienna PASS
2019/07/18 全球购物
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
大学生求职计划书
2014/04/30 职场文书
学习之星事迹材料
2014/05/17 职场文书
普通党员对照检查材料
2014/08/28 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
消防安全月活动总结
2015/05/08 职场文书
2015年学校管理工作总结
2015/07/20 职场文书