Как получить измененную дату / время файла? filemtime / fileatime не возвращает правильное значение - PullRequest
1 голос
/ 10 октября 2019

На моем сервере, работающем под Windows XP и PHP 5.4.16, похоже, что filemtime и fileatime возвращают значение времени создания.

$r = touch("/$fname",10,10);
if ($r===false)
   echo " FAILED ";
$stat = stat("/$fname");
print_r($stat);
$int = fileatime($fname);
$int2 = filemtime($fname);
echo "$int $int2";

Stat () возвращает этот массив:

(
    [0] => 15
    [1] => 0
    [2] => 33206
    [3] => 1
    [4] => 0
    [5] => 0
    [6] => 15
    [7] => 0
    [8] => 11
    [9] => 11
    [10] => 1570657454
    [11] => -1
    [12] => -1
    [dev] => 15
    [ino] => 0
    [mode] => 33206
    [nlink] => 1
    [uid] => 0
    [gid] => 0
    [rdev] => 15
    [size] => 0
    [atime] => 11
    [mtime] => 11
    [ctime] => 1570657454
    [blksize] => -1
    [blocks] => -1
)

Но время создания эхо-печати:

1570657955 1570657955

Я знаю, что вместо этого могу использовать stat (), но почему функция, которая должна выполнять эту работу, не работает для меня? И если это работает для вас, разве stat () не медленнее, чем filemtime?

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Использовать filectime . Для Windows он вернет время создания, а для Unix - лучшее время, которое вы можете получить, потому что в Unix нет времени создания (в большинстве файловых систем).

<?php

// outputs e.g.  somefile.txt was last changed: December 29 2018 22:16:23.

$filename = 'somefile.txt';
if (file_exists($filename)) {
    echo "$filename was last changed: " . date("F d Y H:i:s.", filectime($filename));
}

?>
0 голосов
/ 10 октября 2019

Решение Дресина Опреа:

function GetCorrectMTime($filePath)
{

    $time = filemtime($filePath);

    $isDST = (date('I', $time) == 1);
    $systemDST = (date('I') == 1);

    $adjustment = 0;

    if($isDST == false && $systemDST == true)
        $adjustment = 3600;

    else if($isDST == true && $systemDST == false)
        $adjustment = -3600;

    else
        $adjustment = 0;

    return ($time + $adjustment);
} 

Протестировано на Windows и работает нормально.

Я также протестировал измерение разницы во времени с помощью stat () и этой функции, и оба показывают 0 микросекунд.

Обнаружение DST во время файла перепутано с тем, находится ли время CURRENT текущей системы в настоящее время под DST. (Дастин Опря)

https://www.php.net/manual/en/function.filemtime.php

Модифицированная версия:

function GetCorrectMTime($filePath)
{
 static $init;
 $time = filemtime($filePath);
 $adjustment = 0;
 if ( $init === null ) 
  {
  $init = true;
  $isDST = (date('I', $time) == 1);
  $systemDST = (date('I') == 1);
  $adjustment = 0;
  if($isDST == false && $systemDST == true)
      $adjustment = 3600;
  else if($isDST == true && $systemDST == false)
      $adjustment = -3600;
  }
  return ($time + $adjustment);
} 
...