仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1067|回复: 20
打印 上一主题 下一主题

[学习教程] PHP网页设计PHP日期处置函数 整型日期格局

[复制链接]
再见西城 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:40:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
培训的第三阶段,开始接触MYSQL,设计数据库,学习PHP如何去连接MYSQL数据库。对于MYSQL,我并不陌生,因为学校开设了Linux系统的课程,对于数据库的操作。   当我曩昔用ASP时处理这个成绩相当复杂,ASP有响应的函数DateDiff可以给出两个日时代距离几何月、几何天和几何秒。当我搜索完PHP手册后我发明PHP并没有相似的函数。
本文包括以下内容:
1、 失掉今朝的日期和工夫-咱们有几何种体例?
2、 改动日期显示的体例-日期和工夫的显示模式
3、 转换如今的日期为Unix的工夫戳值
4、 改动日期
a. 增添工夫
b. 减去工夫
c. 找出两日期之间的距离
5、 为PHP添加DateAdd函数
6、 为PHP添加DateDiff函数
**失掉今朝的日期和工夫
在Unix中,工夫的暗示体例为盘算从1970年1月1日零时起所曩昔的秒数,这称为UNIX 工夫戳(Unix Epoch)。
假如咱们有如许一段的代码:
复制代码 代码以下:
<?
echo time();
?>;

将前往值958905820
而此时的工夫为2000年5月21日12时43分。
你或许会说这相当不错。当这对我毫无匡助,或只要一点匡助。在PHP中,对日期处置的函数都必需用到由time()前往的工夫戳值。同时,因为PHP在Unix和Windows体系中均利用一样的工夫戳值,这就答应你不需求修正代码便可在分歧的体系间移植。别的的一个优点是time()函数前往的是一个整数,你可以将其作为整数字段或文本字段存入数据库,而不用利用出格的日期/工夫字段。
你已根基懂得了Unix的工夫戳值,如今让咱们来展现它的实践用处。
改动日期显示的体例-日期和工夫的显示模式
PHP供应两个举措来将Unix的工夫戳值转换成为有效的数据。第一个是date()函数。这个函数有两个参数-第一个字符串用于设定你所但愿前往的格局,第二个为Unix的工夫戳值。
格局化字符通同过一些复杂的特别格局化字符来显示你所但愿看到的格局的日期和工夫。假定你但愿日期以如许的格局显示“18h01 Sunday 21 May”。
咱们需求对字符串中的每局部利用一个特别格局化字符,你可以从PHP手册中日期和工夫函数库中找到。如许的特别格局化字符数目很多,他们所暗示的相似于礼拜几、月的英文名、用2位或4位数暗示的年份,是不是是上午(AM)或下战书(PM)和其他。关于这个例子咱们需求的特别字符为:
‘H' -24 小时制的小时
‘i'- 分钟
‘l'- 礼拜几的英文全名
‘d'- 本月的第几日
‘F'- 月份的英文全名
因而咱们的格局化字符串为”Hhi l d F”, PHP代码为:
复制代码 代码以下:
<?
echo date ("Hhi l d F" ,time());
?>;

当咱们履行这段代码,咱们发明咱们所失掉的了局为:
180609 Sunday 21 May
如许的了局看起来有些奇异。让咱们再查一下PHP手册,本来'h'所代表的是12 小时制的小时数。这再次证实了一句真谛:“盘算机只做你所告知它该做的,而不是你想要它做的”。咱们有两个选择。第一个是在h前利用本义字符“\”:
echo date ("H\hi l d F", time());
咱们失掉如许的了局:
18h12 Sunday 21 May
这恰是咱们所要的。但假如咱们在一个非常庞杂的句子中需求包括日期和工夫,咱们是不是需求对每一个字符利用本义字符?
谜底固然是不。咱们利用另外一个函数strftime()。
strftime()有两个优点。
第一个优点咱们其实不在本文会商局限内-假如你利用setlocale()函数,你可以经由过程strftime失掉响应言语的月份的称号。
别的的一个优点是你可以将出格的日期和工夫的格局化字符包括在你的字符串中。这同时也意味着不管你是不是要进修date()函数的一切特别格局化字符,你都必需进修一整套完整分歧的格局化字符。
strftime()任务的体例和date()没有甚么分歧,除特别格局化字符的后面必需添加一个百分号%。假如用strftime()函数,后面例子的代码以下:
复制代码 代码以下:
<?
echo strftime ("%Hh%M %A %d %b" ,time());
?>;

了局为:
18h24 Sunday 21 May
这或许看起来将简化繁,但思索一下假如你所需求的显示的为
"Today is Sunday 21 May 2000. The time is somewhere close to 18h24."
我想利用date()函数无疑使人感应腻烦。
在入手下手的时分,我说起咱们有两种体例可以从Unix工夫戳值中失掉有效的数据。咱们方才懂得了date()和strftime()。另外一个getdate()。这个函数只需求Unix 的工夫戳值作为参数,而函数的前往值为日期和工夫的数组。
上面是一个例子:
复制代码 代码以下:
<?
$date_time_array = getdate (time());
echo $date_time_array[ "weekday"];
?>;

前往的了局为:
Sunday
除"weekday",该数组的其他局部为:
"seconds" C秒
"minutes" C分
"hours" C小时
“mday" - 本月的第几天
"wday" -本周的第几天(数字)
"mon" -月(数字)
"year" C年
"yday" - r今年的第几天(数字)
"month" -月份全名
咱们如今可以失掉轻易识别的日期和工夫。那末其他呢?
**转换如今的日期为Unix的工夫戳值
凡是你必需处置一些日期或工夫格局的数据。翻开M$的一个Access数据库,一切的日期都以YYYY/MM/DD的格局存储,到场今朝的日前即为2000/05/27。Mktime()函数可以将一个工夫转换成Unix的工夫戳值。
函数的格局为:int mktime(int hour, int minute, int second, int month, int day, int year, int [is_dst] );
从左往右你必需供应小时、分、秒、月、天和年。最初一个参数用于指定你是不是处于夏令时,此参数是可选的,所以咱们将疏忽它。
代码以下:
复制代码 代码以下:
<?
echo mktime (0, 0,0 ,5, 27,2000 );
?>;

因为不晓得小时、分和秒同时这些参数必需填写,我将其设置为0。设置为0意味着工夫为午夜。
复制代码 代码以下:
<?
$access_date = "2000/05/27";
//explode()函数用一个字符串作为分界来分化另外一个字符串。这个例子$access_date经由过程字符串”/”来分化
$date_elements = explode("/" ,$access_date);
// 此时
// $date_elements[0] = 2000
// $date_elements[1] = 5
// $date_elements[2] = 27
echo mktime (0, 0,0 ,$date_elements [1], $date_elements[ 2],$date_elements [0]);
?>;

咱们看一个比从Access数据库纯真取得日期更庞杂的情形,咱们失掉一个以下格局的日期和工夫:2000/05/27 02:40:21 PM
复制代码 代码以下:
<?
// 来自Access的字符串
$date_time_string = "2000/05/27 02:40:21 PM";
// 将字符串分化成3局部-日期、工夫和上午/下战书
$dt_elements = explode(" " ,$date_time_string);
// 分化日期
$date_elements = explode("/" ,$dt_elements[ 0]);
// 分化工夫
$time_elements = explode(":" ,$dt_elements[ 1]);
// 假如是下战书,咱们将工夫增添12小时以便失掉24小时制的工夫
if ($dt_elements [2]== "PM") { $time_elements[ 0]+=12;}
// 输入了局
echo mktime ($time_elements [0], $time_elements[ 1], $time_elements[ 2], $date_elements[1], $date_elements[2], $date_elements[0]);
?>;

**修正日期
有时咱们需求晓得6小时今后是甚么工夫,35天前的日期或从你最初一次玩Quake3后已曩昔几何秒。咱们已晓得若何用mktime()函数从独自的日期和工夫中取得Unix的工夫戳值。假如咱们需求的并不是今朝日期和工夫的Unix工夫戳值,咱们该咋办?上面是一些实习可以匡助申明咱们前面所要做的。
正如后面所见,mktime()利用以下参数:小时、分、秒、月、天和年。想一想第二节,getdate()函数可觉得咱们取得这些参数。
复制代码 代码以下:
<?
// 将今朝的工夫戳值放入一数组内
$timestamp = time();
echo $timestamp;
echo "p";
$date_time_array = getdate( $timestamp);
// 用mktime()函数从头发生Unix工夫戳值
$timestamp = mktime($date_time_array ["hours"], $date_time_array["minutes" ],$date_time_array[ "seconds"],$date_time_array ["mon"], $date_time_array["mday" ],$date_time_array[ "year"]);
echo $timestamp;
?>;

看起来有一些使人感应利诱。我将用一些变量来使下面的法式看起来更轻易懂得。
复制代码 代码以下:
<?
// 将今朝的工夫戳值放入一数组内
$timestamp = time();
echo $timestamp;
echo "p";
$date_time_array = getdate( $timestamp);
$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"];
// 用mktime()函数从头发生Unix工夫戳值
$timestamp = mktime($hours ,$minutes, $seconds,$month ,$day,$year);
echo $timestamp;
?>;

如今咱们将由getdate()所发生的工夫戳值放入绝对应的称号变量中,所以代码变得绝对轻易浏览和了解。如今假如咱们需求在今朝的工夫上加上19个小时,咱们用$hours+19取代mktime()函数中的$hours。mktime()将主动为咱们将工夫转到第二天。
复制代码 代码以下:
<?
// 将今朝的工夫戳值放入一数组内
$timestamp = time();
echo strftime( "%Hh%M %A %d %b",$timestamp);
echo "p";
$date_time_array = getdate($timestamp);
$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"];
// 用mktime()函数从头发生Unix工夫戳值
// 增添19小时
$timestamp = mktime($hours + 19, $minutes,$seconds ,$month, $day,$year);
echo strftime( "%Hh%M %A %d %b",$timestamp);
echo "br~E after adding 19 hours";
?>;

运转后失掉:
14h58 Saturday 03 Jun
09h58 Sunday 04 Jun
~E after adding 19 hours
削减工夫也是一样的-你只需求削减响应变量的值便可。
失掉两个分歧工夫值的差一样也长短常复杂。你所需求做的只是将两个工夫值转换为Unix的工夫戳值,然后二者相减便可。二者之差即为两个工夫所相隔的秒数。别的一些算法可以很快地将秒转为天、小时、分和秒。
**为PHP添加DateAdd函数
正如在文章一入手下手我所说的-写本文的缘由是由于我在PHP中找不到相似ASP的DateDiff函数。在引见完PHP是若何处置日期和工夫,让咱们将ASP中经常使用的两个函数移植到PHP。第一个函数是DateAdd。
依据Vbscript的文档,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 DateAdd ($interval, $number, $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;
}
$timestamp = mktime($hours ,$minutes, $seconds,$month ,$day, $year);
return $timestamp;}
?>;

咱们可以将下面的代码保留为dateadd.inc文件,然后运转以下代码:
复制代码 代码以下:
<?
include('dateadd.inc');
$temptime = time();
echo strftime( "%Hh%M %A %d %b",$temptime);
$temptime = DateAdd("n" ,50,$temptime);
echo "p";
echo strftime( "%Hh%M %A %d %b",$temptime);
?>;

咱们将失掉:
15h41 Saturday 03 Jun
16h31 Saturday 03 Jun
为PHP添加DateDiff函数
如今DateAdd已完成,那末DateDiff呢?
依据文档,DateDiff(interval,date1,date2)函数的界说为“前往两个日期之间的工夫距离”。
Intervals参数的用法与DateAdd函数中的不异。出于防止过于庞杂的思索,咱们决意疏忽Vbscript中DateDiff函数中其它庞杂的参数,即其两个可选的参数变量[firstdayofweek[, firstweekofyear]](它们用于决意礼拜中第一天是礼拜天仍是礼拜一和一年中第一周的常数。并且咱们只答应intervals有以下五个值:"w"(周)、"d"(天)、"h"(小时)、"n"(分钟) 和"s"(秒)。
Let's see what we can come up with: 上面的代码是咱们所需求的:
复制代码 代码以下:
<?
Function DateDiff ($interval, $date1,$date2) {
// 失掉两日期之间距离的秒数
$timedifference = $date2 - $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;}
?>;

将下面的代码存为datediff.inc文件,然后运转上面的代码:
复制代码 代码以下:
<?
include('datediff.inc');
include('dateadd.inc');
$currenttime = time();
echo "Current time: ". strftime("%Hh%M %A %d %b" ,$currenttime)."br";
$newtime = DateAdd ("n",50 ,$currenttime);
echo "Time plus 50 minutes: ". strftime("%Hh%M %A %d %b" ,$newtime)."br";
$temptime = DateDiff ("n",$currenttime ,$newtime);
echo "Interval between two times: ".$temptime;
?>;

假如一切顺遂,你可以看到以下了局:
Current time: 16h23 Saturday 03 Jun
Time plus 50 minutes: 17h13 Saturday 03 Jun
Interval between two times: 50
假如你在Unix机械上运转PHP,你必需编译PHP撑持BC高精度函数。你必需从以下地址http://www.php.net/extra/number4.tar.gz下载BC库,然后将其解压到PHP4的根目次下,从头编译PHP,编译时要加上--enable-bcmath的选项。(具体申明见PHP4中README.BCMATH)。PHP4的Windows版本则不需求做任何修补便可直接利用BC高精度函数。
如今你已失掉处置日期和工夫的函数,剩下的就是若何将其应用到你的PHP法式中。怎么样出来了吧,怎么样自己也可以写出php程序了,虽然离职业和专业的人还有很远,但是好的开始是成功的一半。这个时候改怎么做了呢。现在就是拿1本高手推荐的书,重头到尾读1遍,我说的这个读是自己看。
山那边是海 该用户已被删除
沙发
发表于 2015-2-4 05:56:13 | 只看该作者
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
莫相离 该用户已被删除
板凳
发表于 2015-2-9 16:29:01 | 只看该作者
兴趣是最好的老师,百度是最好的词典。
地板
发表于 2015-2-27 10:26:43 | 只看该作者
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
透明 该用户已被删除
5#
发表于 2015-3-7 21:11:31 | 只看该作者
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
蒙在股里 该用户已被删除
6#
发表于 2015-3-11 00:15:36 | 只看该作者
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
爱飞 该用户已被删除
7#
发表于 2015-3-17 16:42:42 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
乐观 该用户已被删除
8#
发表于 2015-3-17 21:09:41 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
再见西城 该用户已被删除
9#
 楼主| 发表于 2015-3-24 11:49:17 | 只看该作者
实践是检验自己会不会的真理。
小女巫 该用户已被删除
10#
发表于 2015-3-27 22:10:01 | 只看该作者
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
不帅 该用户已被删除
11#
发表于 2015-3-29 18:05:38 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
活着的死人 该用户已被删除
12#
发表于 2015-4-2 23:40:53 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
老尸 该用户已被删除
13#
发表于 2015-4-3 05:06:39 | 只看该作者
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
柔情似水 该用户已被删除
14#
发表于 2015-4-22 03:30:25 | 只看该作者
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
海妖 该用户已被删除
15#
发表于 2015-4-24 15:21:36 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
第二个灵魂 该用户已被删除
16#
发表于 2015-4-26 00:53:39 | 只看该作者
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
谁可相欹 该用户已被删除
17#
发表于 2015-4-27 19:43:03 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
分手快乐 该用户已被删除
18#
发表于 2015-6-12 22:21:31 | 只看该作者
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
兰色精灵 该用户已被删除
19#
发表于 2015-6-17 10:49:10 | 只看该作者
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
飘飘悠悠 该用户已被删除
20#
发表于 2015-6-17 11:28:53 | 只看该作者
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-9-21 03:25

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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