做一个勇于分享的php园丁

PHP开发园地

PHP中计算两个日期的时间差

如果你想利用PHP知道两个日期间相差多长时间。例如,你想告诉用户他最后登录你的网站至今已经过了多长时间了。要实现这个功能,在PHP中可以先把两个日期转换成纪元时间戳,并计算两个时间戳的差值。如下例中将这个差值分解成了周、天、小时、分钟和秒。

<?php
// 7:32:56 pm on May 10, 1965
$epoch_1 = mktime(19,32,56,5,10,1965);
// 4:29:11 am on November 20, 1962
$epoch_2 = mktime(4,29,11,11,20,1962);
$diff_seconds = $epoch_1 - $epoch_2;
$diff_weeks = floor($diff_seconds/604800);
$diff_seconds -= $diff_weeks * 604800;
$diff_days = floor($diff_seconds/86400);
$diff_seconds -= $diff_days * 86400;
$diff_hours = floor($diff_seconds/3600);
$diff_seconds -= $diff_hours * 3600;
$diff_minutes = floor($diff_seconds/60);
$diff_seconds -= $diff_minutes * 60;
print "The two dates have $diff_weeks weeks, $diff_days days, ";
print "$diff_hours hours, $diff_minutes minutes, and $diff_seconds ";
print "seconds elapsed between them.";
?>

输出结果:

The two dates have 128 weeks, 6 days, 14 hours, 3 minutes,
and 45 seconds elapsed between them.

注意,上例中并没有把时间差值分解成比周更大的时间单位(例如:月或者年),这是因为更大的时间单位具有可变的长度,所以不可能准确地表达对时差计算的结果。

这里有几个你应该知道的奇怪的情况。首先,1962年和1965年位于Unix纪元开始之前。幸运的是,mktime()函数在遇到这种情况时会优雅的降级(一种能够向前兼容的能力。),为每个时间生成相应的负纪元时间戳。这没有问题,因为需要的并不是这两个时间戳的绝对时间值,而只是它们的差值而已。只要日期的纪元时间戳位于有符号的整数的范围之内,就能够正确地计算它们的差值。

第二,挂钟(或日历)会反映出这两个日期之间时差的轻微不同,因为这两个日期分别位于夏令时切换点的两侧。虽然时间戳相减得到的是正确的时差值,但人类感觉到的时间推移却要多1小时。比如说,在夏令时4月份的星期天凌晨,1:30一4:30之间的时差是多少?好像应该是3小时,但是这两个时间的纪元时间戳之间却只相关7200秒,即2小时。当一个本地时钟在春天向前调快1小时(或者在10月份调慢1小时)的时候,连续的时间流逝并不会引起人们的注意。所以虽然我们的时钟显示的好像是3小时,而实际上,只过了两个小时。

如果你想要测量实际经过的时间(通常都是这样),这种方法非常有效。如果你更关注这两个时间点上时钟的报时,那么可以使用儒略日(Julian days)来计算时间间隔。

要想告诉用户自他上次登录以来经过了多长时间,必须要知道当前登录时间和他上次最后登录时间的时差,如下例所示。

<?php
$db = new PDO('mysql:host=db.example.com', $user, $password);
$epoch_1 = time();
$st = $db->prepare("SELECT UNIX_TIMESTAMP(last_login) AS login " .
"FROM user WHERE id = ?");
$st->execute(array($id));
$row = $st->fetch();
$epoch_2 = $row['login'];
$diff_seconds = $epoch_1 - $epoch_2;
$diff_weeks = floor($diff_seconds/604800);
$diff_seconds -= $diff_weeks * 604800;
$diff_days = floor($diff_seconds/86400);
$diff_seconds -= $diff_days * 86400;
$diff_hours = floor($diff_seconds/3600);
$diff_seconds -= $diff_hours * 3600;
$diff_minutes = floor($diff_seconds/60);
$diff_seconds -= $diff_minutes * 60;
print "You last logged in $diff_weeks weeks, $diff_days days, ";
print "$diff_hours hours, $diff_minutes minutes, and $diff_seconds ago.";

好了,PHP中计算两个日期的时间差就介绍到这里了。

转载请注明:http://www.itivy.com/php/archive/2012/2/19/php-time.html

标签: PHP, PHP时间差

我也来参与讨论

你还可以输入600/600个字符 发表评论
称呼: (必填) 登录 | 开通博客
邮箱: (选填) 你的邮箱地址不会被公开
网站: (选填)
验证码: (必填)
看不清换一张 看不清楚换一张