`
aideehorn
  • 浏览: 261503 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

php日期和时间相关函数互相转换

    博客分类:
  • php
阅读更多

php日期和时间相关函数互相转换锦集

这是一篇非常好的文章,偶成功的运用一个access数据库 的东西转到mysql 上,其中时间问题是首要考虑处理,大虾就不用往下看了……p开源
一下是一篇文章转帖:有少许改动……在Unix中,时间的表示方式为计算从1970年1月1日零时起所过去的秒数,这称为UNIX 时间戳(Unix Epoch)。  
如果我们有这样一段的代码php开源
<?php
        echo time();
?>

        返回值1162541319,而此时的时间为Fri Nov  3 16:11:52 HKT 2006
        在PHP 中,对日期处理的函数 都必须用到由time()返回的时间戳值。同时,由于PHP在Unix和Windows系统 中均使用同样的时间戳值,这就允许你不需要修改代码即可在不同的系统间移植。另外的一个好处是time()函数返回的是一个整数,你可以将其作为整数字段或文本字段存入数据库,而不必使用特别的日期/时间字段。
现在让我们来展示它的实际用途:
php开源
改变日期显示的方式-日期和时间的显示形式
        PHP提供两个办法来将Unix的时间戳值转换成为有用的数据。第一个是date()函数。这个函数有两个参数-第一个字符串用于设定你所希望返回的格式,第二个为Unix的时间戳值。  
格式化字符串通过一些简单的特殊格式化字符来显示你所希望看到的格式的日期和时间。假设你希望日期以这样的格式显示“18h01 Sunday 21 May”。  
我们需要对字符串中的每一部分使用一个特殊格式化字符,你可以从PHP手册 中日期和时间函数库中找到。这样的特殊格式化字符数量不少,他们所表示的类似于星期几、月的英文名、用2位或4位数表示的年份,是否是上午(AM)或下午(PM)以及其他。对于这个例子我们需要的特殊字符为:  
‘H’ -24 小时制的小时  
‘i’- 分钟  
‘l’- 星期几的英文全名  
‘d’- 本月的第几日  
‘F’- 月份的英文全名  
因此我们的格式化字符串为”Hhi l d F”, PHP代码为:  
php开源
<?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()函数,前面例子的代码如下:  

<?php
echo strftime ("%Hh%M %A %d %b" ,time());
?>  
php开源
结果为:  
18h24 Sunday 21 May  
这也许看起来将简化繁,但考虑一下如果你所需要的显示的为"Today is Sunday 21 May 2000. The time is somewhere close to 18h24." 我想使用date()函数无疑令人感到厌烦。  
在开始的时候,我提及我们有两种方式可以从Unix时间戳值中得到有用的数据。我们刚刚了解了date()和strftime()。另一个getdate()。这个函数只需要Unix 的时间戳值作为参数,而函数的返回值为日期和时间的数组。

下面是一个例子:  
<?php
$date_time_array = getdate (time());
echo $date_time_array[ "weekday"];
?>  


返回的结果为:  
Sunday  
除了"weekday",该数组的其他部分为:  
"seconds" –秒  
"minutes" –分  
"hours" –小时  
“mday" - 本月的第几天  
"wday" -本周的第几天(数字)  
"mon" -月(数字)  
"year" –年  
"yday" - r本年的第几天(数字)  
"month" -月份全名  
我们现在可以得到容易辨认的日期和时间。那么其他呢?  

**转换现在的日期为Unix的时间戳值  php开源

通常你必须处理一些日期或时间格式的数据。打开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] );  
从左往右你必须提供小时、分、秒、月、天和年。最后一个参数用于指定你是否处于夏令时,此参数是可选的,所以我们将忽略它。  
代码如下:

  
<?php
echo mktime (0, 0,0 ,5, 27,2000 );
?>  


由于不知道小时、分和秒同时这些参数必须填写,我将其设置为0。设置为0意味着时间为午夜。  
<?php
$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  
<?php
// 来自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()函数可以为我们获得这些参数。  
<?php
// 将目前的时间戳值放入一数组内
$times****p = time();
echo $times****p;
echo "<p>";  
$date_time_array = getdate( $times****p);  
// 用mktime()函数重新产生Unix时间戳值  
$times****p = 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 $times****p;  
?>  
看起来有一些令人感到迷惑。我将用一些变量来使上面的程序看起来更容易了解。  


<?php
// 将目前的时间戳值放入一数组内
$times****p = time();
echo $times****p;
echo "<p>";  
$date_time_array = getdate( $times****p);  
$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时间戳值  
$times****p = mktime($hours ,$minutes, $seconds,$month ,$day,$year);  
echo $times****p;  
?>  
现在我们将由getdate()所产生的时间戳值放入相对应的名称变量中,所以代码变得相对容易阅读和理解。现在如果我们需要在目前的时间上加上19个小 时,我们用$hours+19代替mktime()函数中的$hours。mktime()将自动为我们将时间转到第二天。  


<?php
// 将目前的时间戳值放入一数组内
$times****p = time();
echo strftime( "%Hh%M %A %d %b",$times****p);
echo "<p>";  
$date_time_array = getdate($times****p);  
$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小时  
$times****p = mktime($hours + 19, $minutes,$seconds ,$month, $day,$year);  
echo strftime( "%Hh%M %A %d %b",$times****p);  
echo "<br>~E after adding 19 hours";  
?>  
运行后得到:  
14h58 Saturday 03 Jun  
09h58 Sunday 04 Jun  
~E after adding 19 hours  
减少时间也是同样的-你只需要减少相应变量的值即可。  
得到两个不同时间值的差同样也是非常简单。你所需要做的只是将两个时间值转换为Unix的时间戳值,然后两者相减即可。两者之差即为两个时间所相隔的秒数。另外一些算法可以很快地将秒转为天、小时、分和秒。  

**为PHP添加DateAdd函数 php开源

正如在文章一开始我所说的-写本文的原因是因为我在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天。  
<?php
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;
}
$times****p = mktime($hours ,$minutes, $seconds,$month ,$day, $year);
return $times****p;}
?>  
我们可以将上面的代码保存为dateadd.inc文件,然后运行以下代码:  
<?php
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: 下面的代码是我们所需要的:  
<?php
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文件,然后运行下面的代码:

  
<?php
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程序中。
分享到:
评论

相关推荐

    MySQL中日期和时间戳互相转换的函数和方法

    本篇文章将深入探讨如何在MySQL中进行日期和时间戳之间的转换,这对于数据分析、报表生成以及时间相关的操作至关重要。 首先,我们来看如何将时间戳转换为日期。MySQL提供了`FROM_UNIXTIME()`函数,它接受一个Unix...

    PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)

    写过PHP+MySQL的程序员都知道有时间差,UNIX时间戳和格式化日期是我们常打交道的两个时间表示形式,Unix时间戳存储、处理方便,但是不直观,格式化日期直观,但是处理起来不如Unix时间戳那么自如,所以有的时候需要...

    php日期转时间戳,指定日期转换成时间戳

    写过PHP+MySQL的程序员都知道有时间差,UNIX时间戳和格式化日期是我们常打交道的两个时间表示形式,Unix时间戳存储、处理方便,但是不直观,格式化日期直观,但是处理起来不如Unix时间戳那么自如,所以有的时候需要...

    C#中系统时间和UNIX时间戳互相转换

    在C#编程中,系统时间和UNIX时间戳之间的转换是常见的操作,特别是在与使用UNIX时间戳作为时间标准的其他系统(如PHP)进行交互时。UNIX时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不包括闰秒。下面...

    Mysql中时间戳转为Date的方法示例

    其他相关文章,如“MySQL中日期和时间戳互相转换的函数和方法详解”、“MySQL日期、字符串、时间戳互转”等,可以帮助你更深入地了解MySQL中的日期时间处理。而“PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期...

    php格式化json函数示例代码

    除了上述自定义函数之外,该部分还提到了一些在线工具,如“在线PHP代码格式化美化工具”和“在线XML/JSON互相转换工具”,这些工具为开发者提供了一个方便快捷的环境,用于处理和美化代码,以及在XML与JSON格式之间...

    PHP实现获取某个月份周次信息的方法

    在PHP中,时间戳通常表示为一个整数值,可以通过`strtotime()`和`date()`函数与日期和时间进行互相转换。 4. `date_default_timezone_set()`函数:在处理日期和时间时,需要设置正确的时区,以确保时间计算的准确性...

    php开发中最常用的英语单词.docx

    56. **Calendrical**:日历的,与日期和时间相关的。 57. **Call**:调用,执行函数或方法的动作。 58. **Callback**:回调,当某个事件发生时执行的函数。 59. **Casting**:转型、造型转换,将一个数据类型转换...

    salarybot-php:英国税收系统的工资计算器

    3. **PHP库**:可能使用了PHP库来简化一些计算或数据处理任务,比如日期和时间的转换,或者货币格式化。 4. **税收率**:项目需要包含当前的英国税级和税率,可能以配置文件或数据库的形式存储,以便于更新。 5. *...

    PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子

    - `orderDate` 和 `orderTime`:订单日期和时间,用于记录交易发生的时间。 - `tranType`:交易类别,区分B2C等不同类型的交易。 - `amount`:订单金额,需要与ECSHOP订单中的金额一致。 - `curType`:交易币种,...

    VeryIDE Bee 互动营销平台 v1.4 UTF-8.rar

    更新 泛表单应用的描述项支持 HTML 代码 更新 泛表单应用的数据增加 IP 地址、拆分日期和时间输出 更新 用户偏好设置支持自定义背景图,并调整圣诞节时期为固定风格 更新 "自定义广告"增加图片预览输出,感谢 暨阳...

Global site tag (gtag.js) - Google Analytics