我对php中的各种日期函数和格式感到非常困惑,所以我想尽可能寻求帮助。 我正在尝试查找两个日期之间修改过的文件,但语法让我感到困惑。例如,如果我试图找到6个月到1年前改变的文件,我试过:
$yearago = new DateTime("now");
date_sub($yearago, date_interval_create_from_date_string("1 year"));
$sixmonthsago = new DateTime("now");
date_sub($sixmonthsago, date_interval_create_from_date_string("6 months"));
$dir = '/datacore/';
$files1 = scandir($dir);
foreach($files1 as $key => $value)
{
$datemod = filemtime($value);
if ($datemod>$yearago && $datemod<$sixmonthsago) // eg between 6 and 12 months ago
{
// Do stuff
}
}
我知道这是低效的;在目录中找到一个文件名数组,然后在filemtime上循环遍历这个数组,但这是未来的工作,但是日期和日期时间的混合让我感到困惑。
答案 0 :(得分:0)
您没有将date_sub值分配回变量,因此“减去”值就会丢失。你应该有:
$yearago = date_sub($yearago, ...);
另外,您可以简单地告诉DateTime生成适当的日期:
$yearago = new DateTime("1 year ago");
$sixmonths = new DateTime('6 months ago');
请注意$yearago
和$sixmonths
是DateTime对象,而filemtime()
返回标准Unix时间戳,您无法直接比较它们。
所以你可能只有
$yearago = strtotime('1 year ago');
$sixmonths = strtotime('6 months ago');
为您提供开始时间戳,无需进一步转换
答案 1 :(得分:0)
您可以使用strtotime
函数从人类时间表示生成时间戳(例如1 year ago
)。
现在您可以像这样使用它:
<?php
// Load Timestamps
$sixMonthsAgo = strtotime("6 months ago");
$oneYearAgo = strtotime("1 year ago");
// Load Files & Check Timestamps
// Note* you can filter by ext, e.g: /datacore/*.pdf
$myFiles = glob("/datacore/*");
// Now Check & Build List
$checkedFiles = array();
foreach ($myFiles as $myFile) {
$fileModifiedTime = filemtime($myFile);
if ($fileModifiedTime >= $oneYearAgo && $fileModifiedTime <= $sixMonthsAgo)
$checkedFiles[] = $myFile;
}
// Debug
echo "Found ". sizeof($checkedFiles) ." files that were updated from ".
date('d-m-Y H:i:s a', $sixMonthsAgo) ." to ".
date('d-m-Y H:i:s a', $oneYearAgo);
echo "<pre>";
print_r($checkedFiles);
echo "</pre>";
答案 2 :(得分:-1)
GitHub上有一个名为ZFYL zipper
的项目如果您在服务器上部署它,请将目录更改为zip ,然后将模式更改为仅显示可压缩文件列表。
该计划的图片:
另外,如果需要,可以将zipper.php包含到任何php文件中并调用内置函数。
GitHub wiki页面(github.com/ZFYL/zipper/wiki/Functions)中描述了如何使用此库。