当前位置: 编程技术>php
本页文章导读:
▪php的日期处理函数及uchome的function_coomon中日期处理函数的研究
代码如下: <?php echo time(); echo mktime(11,25,0,9,5,2010);//和time一样的 echo microtime(); echo mktime(0,0,0,1,1,1970); ?> 这里面输出分别是1283657290、1283657100、0.88533200 1283657290、-25200。从最后一个值看,我.........
▪PHP日期处理函数 整型日期格式
当我过去用ASP时解决这个问题相当简单,ASP有相应的函数DateDiff可以给出两个日期间间隔多少月、多少天和多少秒。当我搜寻完PHP手册后我发现PHP并没有类似的函数。 本文包含以下内容: 1.........
▪Base64在线编码解码实现代码 演示与下载
在线演示地址:gb2312版本 http://tools./tools/base64_decode-gb2312.phputf8版本 http://tools./tools/base64_decode-utf8.php 代码如下:<?php header('Content-Type: text/html; charset=gb2312'); $txt1 = stripslashes(trim( @$_POST['text1']).........
[1]php的日期处理函数及uchome的function_coomon中日期处理函数的研究
来源: 互联网 发布时间: 2013-11-30
代码如下:
<?php echo time();
echo mktime(11,25,0,9,5,2010);//和time一样的
echo microtime();
echo mktime(0,0,0,1,1,1970);
?>
这里面输出分别是1283657290、1283657100、0.88533200 1283657290、-25200。从最后一个值看,我们知道这里返回的时间戳是经过了时区调整的,也就是我在中国的1970年1月1日0点,格林尼治还没有到0点呢,于是这里的时间会是负数且整好等于-8*3600。
再看
代码如下:
<?php
echo date ("H i l d F" ,1283657100);
echo gmdate("H i l d F",1283657100);
echo strftime("%Hh%M %A %d %b" ,1283657100);
//strftime()工作的方式和date()没有什么不同,除了特殊格式化字符的前面必须添加一个百分号%。
echo strtotime("2010-9-5 11:25:00");
var_dump(getdate (time()));
?>
这里的输出是11 25 Sunday 05 September、03 25 Sunday 05 September、11h25 Sunday 05 Sep、1283657100、array(11) {
["seconds"]=>
int(9)
["minutes"]=>
int(39)
["hours"]=>
int(11)
["mday"]=>
int(5)
["wday"]=>
int(0)
["mon"]=>
int(9)
["year"]=>
int(2010)
["yday"]=>
int(247)
["weekday"]=>
string(6) "Sunday"
["month"]=>
string(9) "September"
[0]=>
int(1283657949)
}
主要看第三个输出,这里输出的是在中国的2010年9月5日11点25分的时候 格林尼治的时间是多少。这里也要计入时差的。而且这里还有一个很奇妙的就是只有gmdate没有发出警告,其余的都有警告说不能依赖于系统的时区。想象也是,因为gmdate算出来的只是格林尼治的时间,就算是系统时区错了,一加一减就又正常了。
代码如下:
//时间格式化
function sgmdate($dateformat, $timestamp='', $format=0) {
global $_SCONFIG, $_SGLOBAL;
if(empty($timestamp)) {
$timestamp = $_SGLOBAL['timestamp'];
}
$timeoffset = strlen($_SGLOBAL['member']['timeoffset'])>0?intval($_SGLOBAL['member']['timeoffset']):intval($_SCONFIG['timeoffset']);
$result = '';
if($format) {
$time = $_SGLOBAL['timestamp'] - $timestamp;
if($time > 24*3600) {
$result = gmdate($dateformat, $timestamp + $timeoffset * 3600);
} elseif ($time > 3600) {
$result = intval($time/3600).lang('hour').lang('before');
} elseif ($time > 60) {
$result = intval($time/60).lang('minute').lang('before');
} elseif ($time > 0) {
$result = $time.lang('second').lang('before');
} else {
$result = lang('now');
}
} else {
$result = gmdate($dateformat, $timestamp + $timeoffset * 3600);
}
return $result;
}
我们直接看if($format){}里的东西,首先求得系统当前时间和我传进来的时间(一般是数据库里的时间,如2010-9-4 21:00:00)的差。如果时间差是在一天以内,则直接得出结论比如两小时前,如果是大于1天,则调用gmdate。这里我就是很搞不懂的。为什么要调用这个诡异的函数,而不是直接date($timestamp)呢?这他妈的到底是什么意思阿?
gmdate
When run in Finland (GMT +0200), the first line below prints "Jan 01 1998 00:00:00", while the second prints "Dec 31 1997 22:00:00".
代码如下:
<?php
echo date("M d Y H:i:s", mktime(0, 0, 0, 1, 1, 1998));
echo gmdate("M d Y H:i:s", mktime(0, 0, 0, 1, 1, 1998));
?>
也就是说gmdate是考虑过了时差的。这里会输出标准的时间格式,而不是几天前。
接下来着重看uchome的function_common里的函数
代码如下:
//字符串时间化
function sstrtotime($string) {
global $_SGLOBAL, $_SCONFIG;
$time = '';
if($string) {
$time = strtotime($string);
if(gmdate('H:i', $_SGLOBAL['timestamp'] + $_SCONFIG['timeoffset'] * 3600) != date('H:i', $_SGLOBAL['timestamp'])) {
$time = $time - $_SCONFIG['timeoffset'] * 3600;
}
}
return $time;
}
别看这个函数很少,但是看得我很吃力。这里是要把一个时间字符串转换为时间戳。比如我这里输入的是2010 9 4 21:08,则$time的值就是这个时间到January 1 1970 00:00:00 GMT的时间差,这里是要考虑什么时差的。$_SGLOBAL[''timestamp]的值其实和$time一样的方法算出来的,但是数值可能有细小的差别。$_SCONFIG['timeoffset']是在config的那个表里面的,目前其值为8。这里有一种情况是系统的时区是对的,或者是不对的,需要通过$_SCONFIG['timeoffset']来检验。gmdate将传入的时间戳(运行程序的地方的时间戳)经过系统的时区来得到此时格林尼治那个地方的时间。如果是系统时区设对了,那么这个正好一加一减,和后面的相等了(其实这里$_SGLOBAL[''timestamp]的数值是无关紧要的)。如果是正常的,那么就不需要改$time,如果是不正常的,那么需要减一下。但是还是那句话,这他妈的到底是什么意思阿?
[2]PHP日期处理函数 整型日期格式
来源: 互联网 发布时间: 2013-11-30
当我过去用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" –秒
"minutes" –分
"hours" –小时
“mday" - 本月的第几天
"wday" -本周的第几天(数字)
"mon" -月(数字)
"year" –年
"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程序中。
本文包含以下内容:
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" –秒
"minutes" –分
"hours" –小时
“mday" - 本月的第几天
"wday" -本周的第几天(数字)
"mon" -月(数字)
"year" –年
"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程序中。
[3]Base64在线编码解码实现代码 演示与下载
来源: 互联网 发布时间: 2013-11-30
在线演示地址:
gb2312版本 http://tools./tools/base64_decode-gb2312.php
utf8版本 http://tools./tools/base64_decode-utf8.php
<?php
header('Content-Type: text/html; charset=gb2312');
$txt1 = stripslashes(trim( @$_POST['text1']));
$button = @$_POST['button'];
$down = @trim($_GET['down']);
if ($down==1) {
header("Content-type: command");
header("Content-Disposition: attachment; filename=base64_decode.txt");
$contents = file_get_contents(basename($_SERVER['PHP_SELF']));
echo $contents;
exit;
}
?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta content="Base64在线编码解码" name="keywords">
<title>Base64在线编码解码 gb2312</title>
<style>
P {
FONT-SIZE: 9pt;
line-height:150%;
width:50%;
BORDER:#DDDDDD 1px solid;
padding:5px 5px 5px 5px;text-align:justify;
}
A {
text-decoration: none;
font-size:9pt;
color:blue
}
A:hover {
COLOR: red;
TEXT-DECORATION: underline
}
h1 {
font-size:12pt;
text-align:center;
margin-top:30px;
font-family: 微软雅黑, msyh, Tahoma, Helvetica, sans-serif;
}
.bginput, select {
color:#000000;
vertical-align:middle;
padding:2px;
border:1px solid #BAC0C3;
background:#F9FBFD;
}
.button {
vertical-align:middle;
padding:1px 3px 0px 3px;
background:#F3F4F5;
border:1px solid #B7C0C7;
margin:0px;
width:180px;
}
div {
width:100%;
}
</style>
</head>
<body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="100%">
<tr><td height="20" bgcolor="#CCCCCC" align =right >
</td></tr><tr><td valign="top" align =center>
<form name="form1" method="post" action="">
<h1>Base64在线编码解码 gb2312 <a href="/blog_article/down/1.html">源码下载</a></h1>
<p>
请输入转换的地址:
<textarea name="text1" rows="14" ><?php echo htmlspecialchars($txt1,ENT_QUOTES);?></textarea>
<br>
请选择转换的方式:
<textarea rows="14" ><?php
if($button=="编码") echo base64_encode($txt1);
if($button=="解码") echo mb_convert_encoding(base64_decode($txt1),"gb2312","UTF-8");
?>
</textarea>
<br>
</p>
<input type="submit" name="button" value="编码" />
<input type="submit" name="button" value="解码" /><br>
</form>
</td></tr>
<tr><td height="10"></td></tr><tr><td height="20" bgcolor="#CCCCCC" align=center></td>
</tr>
</table>
</body>
</html>
gb2312版本 http://tools./tools/base64_decode-gb2312.php
utf8版本 http://tools./tools/base64_decode-utf8.php
代码如下:
<?php
header('Content-Type: text/html; charset=gb2312');
$txt1 = stripslashes(trim( @$_POST['text1']));
$button = @$_POST['button'];
$down = @trim($_GET['down']);
if ($down==1) {
header("Content-type: command");
header("Content-Disposition: attachment; filename=base64_decode.txt");
$contents = file_get_contents(basename($_SERVER['PHP_SELF']));
echo $contents;
exit;
}
?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta content="Base64在线编码解码" name="keywords">
<title>Base64在线编码解码 gb2312</title>
<style>
P {
FONT-SIZE: 9pt;
line-height:150%;
width:50%;
BORDER:#DDDDDD 1px solid;
padding:5px 5px 5px 5px;text-align:justify;
}
A {
text-decoration: none;
font-size:9pt;
color:blue
}
A:hover {
COLOR: red;
TEXT-DECORATION: underline
}
h1 {
font-size:12pt;
text-align:center;
margin-top:30px;
font-family: 微软雅黑, msyh, Tahoma, Helvetica, sans-serif;
}
.bginput, select {
color:#000000;
vertical-align:middle;
padding:2px;
border:1px solid #BAC0C3;
background:#F9FBFD;
}
.button {
vertical-align:middle;
padding:1px 3px 0px 3px;
background:#F3F4F5;
border:1px solid #B7C0C7;
margin:0px;
width:180px;
}
div {
width:100%;
}
</style>
</head>
<body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="100%">
<tr><td height="20" bgcolor="#CCCCCC" align =right >
</td></tr><tr><td valign="top" align =center>
<form name="form1" method="post" action="">
<h1>Base64在线编码解码 gb2312 <a href="/blog_article/down/1.html">源码下载</a></h1>
<p>
请输入转换的地址:
<textarea name="text1" rows="14" ><?php echo htmlspecialchars($txt1,ENT_QUOTES);?></textarea>
<br>
请选择转换的方式:
<textarea rows="14" ><?php
if($button=="编码") echo base64_encode($txt1);
if($button=="解码") echo mb_convert_encoding(base64_decode($txt1),"gb2312","UTF-8");
?>
</textarea>
<br>
</p>
<input type="submit" name="button" value="编码" />
<input type="submit" name="button" value="解码" /><br>
</form>
</td></tr>
<tr><td height="10"></td></tr><tr><td height="20" bgcolor="#CCCCCC" align=center></td>
</tr>
</table>
</body>
</html>
最新技术文章: