#php #datetime
#php #дата-время
Вопрос:
У меня есть 100 текстовых файлов в каталоге.
Формат имени файла является abcd_2011_04_20.txt
Мне нужно прочитать только СЕГОДНЯШНИЙ файл и файлы за последние 7 дней. Как мне это сделать? РЕДАКТИРОВАТЬ 1 :
У меня уже есть функция dirTxt(dirname), которая возвращает имена файлов в виде массива. Как мне определить файл, соответствующий текущей дате?? а затем получить файлы за предыдущие 7 дней??
РЕДАКТИРОВАТЬ 2 :
Массив возвращает следующее
‘graph.txt ‘ ‘graph1.txt ‘ ‘abcd_2011-04-12.txt ‘ ‘abcd_2011-04-13.txt ‘ ‘abcd_2011-04-24.txt ‘ ‘abcd_2011-04-15.txt ‘ ‘abcd_2011-04-16.txt ‘ ‘abcd_2011-04-17.txt ‘ ‘abcd_2011-04-18.txt ‘ ‘abcd_2011-04-19.txt ‘ ‘abcd_2011-04-20.txt ‘
Ответ №1:
Пример
$dt = time(); // today... or use $dt = strtotime('2010-04-20'); to set custom start date.
$past_days = 7; // number of past days
$filesindir = dirTxt('your_dir');
for ($i=0; $i<=$past_days; $i ) {
$filename = 'abcd_' . date('Y_m_d', $dt) . '.txt';
$files[] = $filename;
$dt = strtotime('-1 day', $dt);
}
$files = array_intersect($filesindir, $files);
print_r($files);
Вывод (может быть таким, зависит от массива $filesindir)
Array
(
[0] => abcd_2011_04_21.txt
[1] => abcd_2011_04_20.txt
[2] => abcd_2011_04_18.txt
[3] => abcd_2011_04_15.txt
)
Комментарии:
1. Привет, но проблема в том, что у меня есть функция под названием dirTxt (), которая возвращает имя каждого отдельного текстового файла в этом каталоге… Как мне определить файл текущего дня, а затем получить файлы за последние 7 дней??? пожалуйста, помогите
2. @Zac, не могли бы вы опубликовать в своем вопросе часть этого списка? У каждого файла есть префикс «abcd_» (или вообще один и тот же префикс)?
3. Но у меня есть функция dirTxt(dirname), которая возвращает имена файлов в виде массива. Как мне определить файл, соответствующий текущей дате?? а затем получить файлы за предыдущие 7 дней??
4. @Zac, посмотри на результат моего ответа? Есть ли у вас этот формат имени файла в вашем файловом массиве? Есть имена файлов за сегодняшний день и 7 дней назад. Вы можете просто использовать это?
5. Я тебя не понимаю… Я добавил это в ваш код…. но это не сработает ..
$text11 is the individual filename
> $filename = ‘abcd_’ . date(‘Y_m_d’, $dt) . ‘.txt’; if ( $filename == $text11) { echo «$filename <br />»; // сделайте что -нибудь с $filename // … еще код … $dt = strtotime(‘-1 день’, $dt); }
Ответ №2:
Я создал вспомогательную функцию на случай, если вам понадобится где-нибудь снова ее использовать. Если нет, вы могли бы легко поместить его код внутри тела цикла.
function getFileName($unixTime) {
return 'abcd_' . date('Y_m_j', $unixTime) . '.txt';
}
$files = array();
foreach(range(0, 6) as $dayOffset) {
$files[] = getFileName(strtotime('-' . $dayOffset . ' day'));
}
var_dump($files)
Выходной сигнал
array(7) {
[0]=>
string(19) "abcd_2011_04_21.txt"
[1]=>
string(19) "abcd_2011_04_20.txt"
[2]=>
string(19) "abcd_2011_04_19.txt"
[3]=>
string(19) "abcd_2011_04_18.txt"
[4]=>
string(19) "abcd_2011_04_17.txt"
[5]=>
string(19) "abcd_2011_04_16.txt"
[6]=>
string(19) "abcd_2011_04_15.txt"
Обновить
Что касается их чтения, просто выполните цикл…
foreach($files as $file) {
if ( ! is_file($file)) {
continue;
}
$contents = file_get_contents($file);
}
Комментарии:
1. Но у меня есть функция dirTxt(dirname), которая возвращает имена файлов в виде массива. Как мне определить файл, соответствующий текущей дате?? а затем получить файлы за предыдущие 7 дней ??….
2. @Zac Вы можете использовать мою вспомогательную функцию для текущего файла …
getFileName(time())
.
Ответ №3:
$filename = 'abcd_' . date('Y_m_d') . '.txt';
if (!file_exists($filename)) {
die("File $filename does not exist");
}
$contents = file_get_contents($filename);
Используйте date('Y_m_d', strtotime('-2 days'))
для получения других дат.
Ответ №4:
Извлеките дату из имени файла и сравните ее с сегодняшней датой.
Для этого в PHP есть функции обработки строк и функции даты / времени.
<?php
function isWithinLastSevenDays($str) {
$pos = strpos($str, "_");
if ($pos === FALSE)
throw new Exception("Invalid filename format");
$str = str_replace('_', '-', substr($str, $pos 1, strlen($str)-$pos-1-4));
$d1 = new DateTime($str);
$d2 = new DateTime();
$d2->modify('-7 days'); // sub() only since PHP 5.3
return ($d2 < $d1);
}
$str = "abcd_2011_04_20.txt";
var_dump(isWithinLastSevenDays($str));
$str = "abcd_2011_04_10.txt";
var_dump(isWithinLastSevenDays($str));
/*
Output:
bool(true)
bool(false)
*/
?>