Skip to content
Advertisement

DateTime::setTime() expects parameter 1 to be int, string given, but disapear when trying to be observed

I have this following piece of code in php7.4 , to create a date from an other

    $date = clone $regularCourse->getNextCronExecutionDate();
    $date->modify('+ 3 days');
    $date->setTime($date->format('H'), $date->format('i'), 0, 0);

I’ve tested it locally and in production, and it used to work fine. And suddenly it started to fail. with the error

DateTime::setTime() expects parameter 1 to be int, string given

and it failed rather regularly and predictably because my sentry gave me 4000 occurence of the event (it’s a cron task that runs every minutes, and sentry show me the error has happened 60 times every hours for the last days)

BUT !

Now that i’ve added some debug in order to display the value, it does not fail anymore The code I’ve used

     // Added to debug some courses failing
     ob_start();
     var_dump($date);
     $dumped_message= ob_get_clean();

     SentryaddBreadcrumb(
         new SentryBreadcrumb(
             SentryBreadcrumb::LEVEL_INFO,
             SentryBreadcrumb::TYPE_DEFAULT,
             'error_reporting',
             "course Id " . $regularCourse->getId()
         )
     );
     SentryaddBreadcrumb(
         new SentryBreadcrumb(
             SentryBreadcrumb::LEVEL_INFO,
             SentryBreadcrumb::TYPE_DEFAULT,
             'error_reporting',
             $dumped_message
         )
     );

I don’t know if var_dump-ing the variable produce some side effect ?

so my questions

  1. when does this error happen ?
  2. why my debug code make the issue disapear ?

Advertisement

Answer

If you use declare(strict_types=1) you need to be careful about types:

  • DateTime::setTime() expects integers:

    public DateTime::setTime ( int $hour , int $minute [, int $second = 0 [, int $microseconds = 0 ]] ) : DateTime
    
  • DateTime::format() returns strings:

    public DateTime::format ( string $format ) : string
    

In this case you can just cast to int, though that can easily mask other format errors:

declare(strict_types=1);
$date = new DateTime();
// Correct
$date->setTime((int)$date->format('H'), (int)$date->format('i'), 0, 0);
// Typo, no error thrown becuase `Sunday` casts to 0
$date->setTime((int)$date->format('l'), (int)$date->format('i'), 0, 0);

… while

$date = new DateTime();
$date->setTime($date->format('l'), $date->format('i'), 0, 0);
// DateTime::setTime() expects parameter 1 to be int, string given
User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement