仓酷云

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

[学习教程] PHP网页设计PHP中的日期处置

[复制链接]
只想知道 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:19:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
告诉你了一个方式,但是缺少努力这一环节,那也是白搭。   我正盘算用PHP编写一种匡助处置体系。我发明我必需晓得处置完最初一名客户的成绩后已曩昔了多长工夫?当我曩昔用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 ("Hhi 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与HTML结合起来完成简单动态页面
只想知道 该用户已被删除
沙发
 楼主| 发表于 2015-2-4 11:40:26 | 只看该作者
兴趣是最好的老师,百度是最好的词典。
深爱那片海 该用户已被删除
板凳
发表于 2015-2-9 22:25:26 | 只看该作者
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。
蒙在股里 该用户已被删除
地板
发表于 2015-3-3 20:29:28 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
金色的骷髅 该用户已被删除
5#
发表于 2015-3-11 08:39:35 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
海妖 该用户已被删除
6#
发表于 2015-3-11 15:48:23 | 只看该作者
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
7#
发表于 2015-3-12 17:27:25 | 只看该作者
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
小魔女 该用户已被删除
8#
发表于 2015-3-13 06:09:17 | 只看该作者
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
愤怒的大鸟 该用户已被删除
9#
发表于 2015-3-20 14:09:46 | 只看该作者
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。
灵魂腐蚀 该用户已被删除
10#
发表于 2015-3-26 03:04:39 | 只看该作者
基础有没有对学习php没有太大区别,关键是兴趣。
若天明 该用户已被删除
11#
发表于 2015-4-16 19:09:19 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
乐观 该用户已被删除
12#
发表于 2015-4-28 17:43:39 | 只看该作者
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
飘灵儿 该用户已被删除
13#
发表于 2015-5-3 00:52:30 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
冷月葬花魂 该用户已被删除
14#
发表于 2015-5-7 06:55:11 | 只看该作者
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
再现理想 该用户已被删除
15#
发表于 2015-5-9 04:59:27 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
admin 该用户已被删除
16#
发表于 2015-5-11 11:58:56 | 只看该作者
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
因胸联盟 该用户已被删除
17#
发表于 2015-6-3 21:25:09 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
小女巫 该用户已被删除
18#
发表于 2015-6-17 22:30:33 | 只看该作者
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
柔情似水 该用户已被删除
19#
发表于 2015-6-18 21:24:43 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
飘飘悠悠 该用户已被删除
20#
发表于 2015-6-25 09:34:04 | 只看该作者
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-23 08:09

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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