- ctype_digit: documentation ( source)
- time: documentation ( source)
- microtime: documentation ( source)
- sprintf: documentation ( source)
<?php
/**
* @param int|float|string $timestamp
*/
function createDateTimeImmutableFromTimestamp($timestamp): \DateTimeImmutable
{
if (\is_string($timestamp)) {
$timestamp = \ctype_digit($timestamp)
? (int)$timestamp
: (float)$timestamp;
}
$secs = (int)$timestamp;
$usecs = \is_float($timestamp)
? (int)(1000000 * ($timestamp - $secs))
: 0;
return \DateTimeImmutable::createFromFormat('U u', \sprintf('%d %06d', $secs, $usecs));
}
$tests = [time(), microtime(true), 1234567890.123, '1.12345678901e9'];
foreach ($tests as $test) {
echo "{$test}: " . createDateTimeImmutableFromTimestamp($test)->format('Y-m-d H:i:s.u') . "\n";
}