Получение и форматирование даты файла в PHP

Раздел: PHP программирование -> Работа с файлами в PHP

Основные функции для получения даты файла

Основной способ:

Для получения даты последней модификации файла используется функция filemtime(). Она возвращает Unix timestamp, который затем форматируется через date().

$file = 'example.txt';
$timestamp = filemtime($file);
$date = date('Y-m-d H:i:s', $timestamp);
echo $date;

Php file date (дата файла в php)

Пояснение: filemtime() принимает путь к файлу, возвращает время последнего изменения (число секунд с 1 января 1970 года). date() превращает timestamp в читаемую строку.

Типичная ошибка: если файл не существует, filemtime() вернёт false и вызовет предупреждение. Решение - проверять существование файла через file_exists().

if (file_exists($file)) {
    $timestamp = filemtime($file);
    echo date('Y-m-d H:i:s', $timestamp);
} else {
    echo 'Файл не найден';
}

Php get file type (определение типа файла в php)

Цель использования: отслеживание изменений, управление кэшем, логирование.

Как получить дату изменения прав доступа или inode?

Для времени последнего изменения inode (например, при смене прав) применяется filectime(). Для последнего доступа - fileatime().

$ctime = filectime($file); // изменение inode
echo 'ctime: ' . date('Y-m-d H:i:s', $ctime);
$atime = fileatime($file); // доступ
echo 'atime: ' . date('Y-m-d H:i:s', $atime);

обработка файлов php (обработка файлов в php)

Проблема: на многих файловых системах (например, ext4) fileatime() может быть отключено для производительности, и будет возвращено то же значение, что и filemtime(). На Windows filectime() возвращает время создания файла, а не изменения inode.

Как учесть временную зону при форматировании?

По умолчанию date() использует временную зону, установленную в php.ini (date.timezone). Можно задать её через date_default_timezone_set().

date_default_timezone_set('Europe/Moscow');
echo date('d.m.Y H:i', filemtime($file));

Files show php file (показ файлов в php)

Ошибка: если зона не установлена, PHP выдаст предупреждение и может использовать UTC. Решение - всегда явно указывать зону в коде.

Как сравнить даты двух файлов?

Сравниваются числовые значения timestamp.

$time1 = filemtime('file1.txt');
$time2 = filemtime('file2.txt');
if ($time1 > $time2) {
    echo 'file1.txt новее';
} elseif ($time1 < $time2) {
    echo 'file2.txt новее';
} else {
    echo 'файлы изменены одновременно';
}

Php загрузка файла (загрузка файла в php)

Этот подход используется для проверки актуальности кэша.

Как получить дату для всех файлов в директории?

Комбинация scandir() и цикла.

$files = scandir('/path/to/dir');
foreach ($files as $f) {
    $full = '/path/to/dir/' . $f;
    if (is_file($full)) {
        echo $f . ' - ' . date('Y-m-d', filemtime($full)) . PHP_EOL;
    }
}

Проблема: scandir() возвращает . и ... Необходимо отфильтровать их или проверять is_file().

Расширенные примеры работы с датами файлов

Ниже приведены более сложные и редко используемые сценарии.

Рекурсивный обход директории с выводом дат

Пример вывода всех файлов в папке и подпапках с указанием времени последнего изменения.

Пример
function filesWithDates($dir) {
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
    );
    foreach ($iterator as $file) {
        if ($file->isFile()) {
            $path = $file->getPathname();
            $time = filemtime($path);
            echo $path . ' - ' . date('Y-m-d H:i:s', $time) . PHP_EOL;
        }
    }
}
filesWithDates('/var/www/html');
/var/www/html/index.php - 2025-02-15 10:30:45
/var/www/html/css/style.css - 2025-02-14 18:12:10
...

Пояснение: RecursiveDirectoryIterator позволяет обойти все вложенные папки без рекурсивных вызовов. Флаг SKIP_DOTS исключает . и ...

Сравнение timestamp с текущим временем для поиска «свежих» файлов

Найти файлы, изменённые за последние 24 часа.

Пример
$dir = '/path/to/logs';
$now = time();
$oneDay = 24 * 60 * 60;
foreach (glob($dir . '/*.log') as $file) {
    if (($now - filemtime($file)) <= $oneDay) {
        echo $file . ' обновлён сегодня' . PHP_EOL;
    }
}
/path/to/logs/access.log обновлён сегодня
/path/to/logs/error.log обновлён сегодня

Проблема: glob() может вернуть неверный порядок, если файлов много. Для больших коллекций лучше использовать DirectoryIterator.

Форматирование даты в разных локалях

Использование IntlDateFormatter для вывода названий месяцев на русском.

Пример
$timestamp = filemtime('data.txt');
$fmt = new IntlDateFormatter('ru_RU', IntlDateFormatter::LONG, IntlDateFormatter::NONE);
echo $fmt->format($timestamp);
15 февраля 2025 г.

Пояснение: расширение intl должно быть включено. Если отсутствует, вернётся английский вариант.

Очистка кэша stat перед повторным вызовом

PHP кэширует результаты stat() для повышения производительности. Если файл изменяется внутри одного скрипта, нужно вызвать clearstatcache().

Пример
$file = 'temp.txt';
file_put_contents($file, 'old');
echo filemtime($file) . PHP_EOL;
sleep(1);
file_put_contents($file, 'new');
clearstatcache(true, $file); // очищаем кэш только для этого файла
echo filemtime($file) . PHP_EOL;
1742210000
1742210001

Без clearstatcache() второй вызов вернёт старое значение. Важно: clearstatcache(true, $file) сбрасывает кэш только для указанного файла.

Обработка больших списков файлов без предупреждений

При использовании filemtime() в цикле по тысячам файлов возможно переполнение памяти из-за кэша stat. Лучше сбрасывать кэш периодически.

Пример
$files = glob('/path/*.txt');
foreach ($files as $i => $f) {
    $mtime = filemtime($f);
    // обработка
    if ($i % 100 == 0) {
        clearstatcache(); // полный сброс
    }
}

Это предотвращает накопление кэша stat, но слегка замедляет выполнение.

Изменение даты файла программно

Функция touch() позволяет установить произвольное время модификации и доступа.

Пример
$newTime = strtotime('2024-12-31 23:59:59');
touch('example.txt', $newTime);
echo date('Y-m-d H:i:s', filemtime('example.txt'));
2024-12-31 23:59:59

Если файла не существует, touch() создаст его. Если нужно изменить только время доступа - третий параметр.

Дата файла в PHP - comments

En
Php file date (php)