Как исправить пропущенные символы и лог микросекунды? - PullRequest
0 голосов
/ 02 июля 2019

У меня есть случаи, когда мои журналы для конкретной задачи отображают, например, 10: 31: 06.500 (с точностью до миллисекунды), и другие моменты, когда отсутствуют символы, например, 10: 31: 06.0.Что мне нужно изменить, чтобы оно всегда показывало 3 символа в миллисекундах?Кроме того, я хотел бы пойти еще дальше, а также отображать микросекунды.Помощь оценена.

// Log to file
public function logs($msg, $file)
{
    $date = date("d-m-y");
    $time = $this->udate('H:i:s.u');

    $f = fopen("logs/" . $date . "-" . $file . ".txt", 'a');

    fputs($f, trim($time) . ",{$msg}\n");

    fclose($f);
}

// Get millisecond timestamps
public function udate($format, $utimestamp = null)
{
    if (is_null($utimestamp))
        $utimestamp = microtime(true);
    $timestamp = floor($utimestamp);
    $milliseconds = round(($utimestamp - $timestamp) * 1000);
    return date(preg_replace('`(?<!\\\\)u`', $milliseconds, $format), $timestamp);
}

1 Ответ

0 голосов
/ 03 июля 2019

Отображение микросекунд будет зависеть от вашей версии PHP и от того, как вы хотите отформатировать время:

PHP <7.1: </strong>

  1. Формат 12:12:12.012342 (seconds.microseconds)
public function udate()
{
    list($microSecondsPastNow, $nowTimeInSeconds) = explode(" ", microtime());

    $microSeconds = $microSecondsPastNow * 1000000;
    //$microSeconds is now an int, so we need to add leading zeroes to achieve 
    //the desired format. E.g. '000001' when we have 1 microsecond.
    $formattedMicroSeconds = str_pad($microseconds, 6, '0');
    $dateFormat = preg_replace('`(?<!\\\\)u`', $formattedMicroSeconds, 'H:i:s.u')

    return date($dateFormat, $nowTimeInSeconds);
}
Формат 12:12:12.012.342 (seconds.milliseconds.microseconds)
public function udate()
{
    list($microSecondsPastNow, $nowTimeInSeconds) = explode(" ", microtime());

    $microSeconds = $microSecondsPastNow * 1000000;

    //$microSeconds is now an int, so we need to add leading zeroes to achieve 
    //the desired format. E.g. '000001' when we have 1 microsecond.
    $formattedMicroSeconds = str_pad($microseconds, 6, '0');
    $dateFormat = preg_replace('`(?<!\\\\)u`', $formattedMicroSeconds, 'H:i:s.u')

    list($milliPart, $microPart) = str_split($microSeconds, 3);

    return date($dateFormat, $nowTimeInSeconds) . ".$milliPart.$microPart";
}

PHP> = 7.1:

Начиная с версии 7.1, new DateTime()заполняет микросекунды фактическим значением.Предыдущие версии заполнены «000000».Итак, если вы в курсе своей версии PHP, большая часть работы уже выполнена.

  1. Формат 12:12:12.012342 (секунд. Микросекунды)
public function udate()
{
    $now = new DateTime();
    return $now->format('H:i:s.u');
}
Формат 12:12:12.012.342 (seconds.milliseconds.microseconds)
public function udate()
{
    $now = new DateTime();
    $microseconds = $now->format('u');
    list($milliPart, $microPart) = str_split($microseconds, 3);
    return $now->format('H:i:s') . ".$milliPart.$microPart";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...