我有一个包含以下行的文件。我想要识别时间戳距离现在不到一周的行(在本例中从8月22日开始)。
log3.txt
28-08-2011 10:29:25 A string
29-08-2011 14:29:25 A new string
20-08-2011 14:29:25 Don’t include
php file
if($file = fopen("/opt/apache2/htdocs/log3.txt", "r"))
{
while(!feof($file))
{
$contents = fgets($file, 23); // This is supposed to be 22.
echo $contents; // With 22 it only returns 08-29-2011 14:29:25 P
if(strtotime($contents) > strtotime("last Monday"))
{
$string1 = fgets($file);
echo "In if $string1";
// Do something
}
else
{
$string1 = fgets($file);
echo "In else $string1"; //Always goes to else statement.
}
}
}
使用date('m-d-Y H:i:s')
创建时间戳。
为什么fgets
需要23个字符,而实际上是22个。
strtotime在这里做错了什么?
解析时间戳少于一周的行最好的方法是什么?
编辑:让它工作
$date = DateTime::createFromFormat('d-m-Y H:i:s', $contents);
if(strtotime($date->format('d-m-Y H:i:s')) > strtotime("last Monday"))
使用d-m-Y
格式或m/d/Y
格式的DateTime函数
谢谢大家的帮助。
使用DateTime::createFromFormat代替。Strtotime()在检测使用的日期格式时可能有问题。
$date = DateTime::createFromFormat('d-m-Y H:i:s A', $contents);
fgets()
的长度参数包含换行符(n
),这就是为什么必须将22+1传递给该参数的原因。
在这种情况下使用fread()
会更合适。
对于strtotime:
strtotime
不能识别您的日期格式,因此您必须使用其他函数来解析它。strptime
可以做到:
strptime('08-29-2011 10:29:25 AM', '%m-%d-%Y %H:%M:%S %p')
引用手册页:
当读取长度为- 1字节时,在换行符(包含在返回值中)或EOF(以先到的为准)结束读取。如果没有指定长度,它将继续从流中读取,直到到达行尾。
至于对话,我将使用strptime(),因为您的日期格式是固定的:
if(strptime($contents, 'm-d-Y H:i:s A') > strtotime("last Monday"))
如果这对你没有帮助,请var_dump()
两个strtotime()
并发布结果。
您的日期格式不适合strtotime
返回timestamp
:
$dt = strtotime("08-29-2011 10:29:25 AM");
var_dump($dt); // false
但这对我有用:
$lm = strtotime('last Monday');
$dt = strtotime('23-08-2011');
if($dt > $lm) {
echo "In if"; // output for dates earlier than 23-08
} else {
echo "In else"; // output for 23-08 and later
}
我不喜欢strtotime()
被扔到公共汽车下面。它不是邪恶的。它有很大的灵活性,但也只能到此为止。
$contents
只需要调整,以便strtotime()
了解您正在为其提供欧式日期时间。你甚至不需要交换任何数字。
使用:
if(strtotime(str_replace("/","-",$contents)) > strtotime("last Monday")){
这是一个比每次迭代实例化一个新对象更简单的修复。