【问题标题】:PHP Date to String to compare datesPHP Date to String 比较日期
【发布时间】:2015-11-06 03:39:36
【问题描述】:

我只有基本的 PHP 知识,我正在使用 PHP+Mysql 并尝试检查 2 个日期之间的天数差异;第一个日期在脚本中由我自己格式化为字符串:

$f_entrega=$_POST['year1']."-".$_POST['month1']."-".$_POST['day1'];

导致问题的第二个日期 ($f_dock) 取自 mysql 数据库,该列采用 DATE 格式。为了比较日期,我执行以下操作:

if(!empty($_POST["id"])){
    $f_entrega=$_POST['f_entrega_a']."-".$_POST['f_entrega_m']."-".$_POST['f_entrega_d'];
    $f_entr=$f_entrega;
    $mysqli=conectar();
    $resultado = $mysqli->query("SELECT id,f_dock FROM pt");
    $row = $resultado->fetch_assoc();
    for ($i=0;$i<count($ids);$i++){
        do{
            if ($ids[$i]==$row["id"]){
                $f_dock=$row["f_dock"];
                break;
            }
        } while ($row = $resultado->fetch_assoc());     
        $error=0;
        var_dump($f_dock);
        $f_dock=strtotime($f_dock);
        $f_dock=date('Ymd',$f_dock);
        $f_entrega=$f_entr;
        $f_entrega=strtotime($f_entrega);
        $f_entrega=date('Ymd',$f_entrega);
        $f_dock=DateTime::createFromFormat('Ymd',$f_dock);
        $f_entrega=DateTime::createFromFormat('Ymd',$f_entrega);
        $dias_vendor=date_diff($f_dock,$f_entrega);
        $tat=$dias_vendor->format('%R%a');

有时它可以正常工作,但有时我会收到警告:strtotime() 期望参数 1 是字符串,[第一行]中给出的对象和 $tat 计算不正确并且具有奇怪的值。 我之前尝试过不同的解决方案,例如$f_dock=(string)$f_dock,但最终在某些情况下转换总是失败。提前感谢您的任何提示。

【问题讨论】:

  • 此错误Warning: strtotime()expects parameter 1 to be string 表示$f_entrega 为空或无效字符串以格式化日期。您可以控制它查看 var_dump 中的值:var_dump($f_entrega) 在 strtotime 函数之前。告诉我们脚本失败时这个 var_dump 的结果是什么
  • var_dump 的输出如下:string(10) "2015-08-11"

标签: php mysql string date compare


【解决方案1】:

您收到的错误是因为您输入的字符串不是strtotime() 函数要转换的有效字符串。

例如2015-08-31 可以很好地转换,todaytomorrow+7 days 也一样。

如需更具体的帮助,您需要告诉我们$f_dock 的价值是什么(正如马科斯在评论中所说,var_dump($f_dock) 将为您提供此信息)。

但是,关于解决方案:

$date1 = strtotime($f_dock); //timestamp in seconds
$date2 = strtotime($f_entrega); //same for the second date
$difference = $date1 - $date2; //difference in seconds between the dates
$days = floor($difference/86400); 

86400 是一天中的秒数,所以找出有多少秒的差异,然后看看有多少天的秒数,然后使用floor() 将数字向下舍入。任务完成。

【讨论】:

  • var_dump 的输出如下:string(10) "2015-08-11"
  • 这对我有用,也应该对你有用,即使 11 之后有空格。你原始帖子上的代码是精确的复制和粘贴吗?
  • 是的,它是......数据库中可能有问题,有时 f_dock 是一个字符串而其他人是一个对象? mysql数据库列设置为DATE,通过"row=$result->fetch_asocc();" 总是相同的straction主题是有时它会失败,而另一些则不会......
  • 我认为我们需要查看更多代码才能提供帮助。 $row = $result->fetch_assoc() 将获取每一列,除非您在 MySQL 查询中只指定了日期列,例如,如果它选择所有数据,那么其中一些列不是日期并且会抛出尝试使用 strtotime() 时出错。您能否更新您的原始帖子以包含所有相关代码?
  • 我刚刚粘贴了完整的代码,FOR 语句在最后一行之后结束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 2020-09-30
相关资源
最近更新 更多