在PHP中执行与日期时间相关的操作

时间:2020-03-05 18:51:27  来源:igfitidea点击:

我们实际上如何执行日期时间操作,例如添加日期,查找差异,找出间隔中不包括周末的多少天?我个人开始将这些操作中的一些传递给我的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方法。但似乎没有一种方法可以计算两个日期之间的工作日。

标题数量不匹配

代码数量不匹配