在PHP中执行与日期时间相关的操作
我们实际上如何执行日期时间操作,例如添加日期,查找差异,找出间隔中不包括周末的多少天?我个人开始将这些操作中的一些传递给我的postgresql dbms,因为通常我只需要发出一个sql语句来获得答案,但是,以PHP的方式进行操作,我将不得不编写更多的代码,这意味着更多的机会发生错误...
PHP中是否有任何不需要大量代码即可进行日期时间操作的库?在"给定两个日期,两个日期之间有多少个工作日?以SQL还是$ pet_lang'实现,通过执行此查询来解决?
SELECT COUNT(*) AS total_days FROM (SELECT date '2008-8-26' + generate_series(0, (date '2008-9-1' - date '2008-8-26')) AS all_days) AS calendar WHERE EXTRACT(isodow FROM all_days) < 6;
解决方案
回答
虽然对于大多数日期时间操作,我通常会转换为Unixtime并在Unixtime整数上执行加法减法等操作,但我们可能需要查看Zend框架Zend_Date类。
它具有我们描述的许多功能。尽管Zend被称为"框架",但它可以作为类库来从中选择元素,效果特别好。我们通常将其包含在项目中,然后在需要时将其插入。
回答
最简单的方法是使用时间戳,表示自2008年1月1日以来的秒数。使用时间戳类型,我们可以执行以下操作:
now = time(); tomorrow = now + 24 * 60 * 60; // 24 hours * 60 minutes * 60 seconds
在php网页上查看有关time(),date()和mktime()的文档。这是我最常使用的三种方法。
回答
我们可以结合使用strtotime,mktime和date进行算术运算
我认为我们提供的代码无法解决示例问题"给定两个日期,两个日期之间有多少个工作日?用SQL或者$ pet_lang'实现,我没有考虑是否有公共假期清单...
回答
PEAR :: Date看起来也可能具有一些有用的功能:http://pear.php.net/package/Date。 PEAR :: Calendar也可能有用:http://pear.php.net/package/Calendar
回答
strtotime()很有用,但如果我们不只是使用它转换格式的日期/时间字符串,它确实会有一些奇怪的行为,这些行为可能会不时弹出。
诸如" +1个月"或者" -3天"之类的内容有时无法提供预期的输出。
回答
如果我们看一下http://php.net/date,则会发现一些使用mktime()
进行操作的示例。
一个简单的例子就是锻炼明天的星期几。我们可以通过在mktime()中的日值中简单地加1来做到这一点,如下所示:
if ($timestamp_diff < (60*60*24*7)) { echo floor($timestamp_diff/60/60/24)." Days"; } elseif ($timestamp_diff > (60*60*24*7*4)) { echo floor($timestamp_diff/60/60/24/7)." Weeks"; } else { $total_months = $months = floor($timestamp_diff/60/60/24/30); if($months >= 12) { $months = ($total_months % 12); $years = ($total_months - $months)/12; echo $years . " Years "; } if($months > 0) echo $months . " Months"; } ?>
因此,在这里,我们将收到YYYY-MM-DD格式的日期,其中包含明天的日期。我们也可以通过简单地将" +"替换为"-"来减去天数。 mktime()
使生活变得更加轻松,并使我们不必进行if语句和其他麻烦的编码嵌套操作。
回答
我们可以像这样获得两个日期之间的天数:
$tomorrow = date("Y-m-d", mktime(0, 0, 0, date("m"), date("d") + 1, date("Y")));
而且我们可以使功能类似(我的工作计算机中未安装php,所以我不能保证语法是100%正确的)
$days = (strtotime("2008-09-10") - strtotime("2008-09-12")) / (60 * 60 * 24);
如果我们不喜欢strtotime并且始终使用相同格式的日期,则可以使用爆炸功能,例如
function isWorkDay($date) { // check if workday and return true if so } function numberOfWorkDays($startdate, $enddate) { $workdays = 0; $tmp = strtotime($startdate); $end = strtotime($enddate); while($tmp <= $end) { if ( isWorkDay( date("Y-m-d",$tmp) ) ) $workdays++; $tmp += 60*60*24; } return $workdays; }
回答
我强烈建议在进行日期计算时使用PHP 5.2的DateTime对象,而不是使用UNIX时间戳。当我们使用返回UNIX时间戳的PHP日期函数时,可以使用的范围非常有限(例如,1970年之前没有)。
回答
PHP5 +的DateTime对象很有用,因为它是跳跃时间,
知道夏令时,但实际上需要一些扩展
解决这个问题。我写了下面的文章来解决类似的问题。
find_WeekdaysFromThisTo()方法是蛮力的,但是如果时间跨度小于2年,则可以相当快速地工作。
list($year, $month, day) = explode("-", $date);
回答
要添加日期,可以使用DateTime :: add方法(将一定数量的天,月,年,小时,分钟和秒添加到DateTime对象中),此功能可从php 5.3.0开始使用。
要找到两个日期之间的时差,可以使用DateTime :: diff方法。但似乎没有一种方法可以计算两个日期之间的工作日。
标题数量不匹配
代码数量不匹配