PHP strtotime() function



我有一个包含以下行的文件。我想要识别时间戳距离现在不到一周的行(在本例中从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")){

这是一个比每次迭代实例化一个新对象更简单的修复。

相关内容

  • 没有找到相关文章

最新更新