【问题标题】:How to obtain modified date/time of file? filemtime/fileatime does not return correct value如何获取文件的修改日期/时间? filemtime/fileatime 不返回正确的值
【发布时间】:2019-10-10 06:00:32
【问题描述】:

在我在 Windows XP 和 PHP 5.4.16 下运行的服务器上,filemtime 和 fileatime 似乎返回了创建时间的值。

$r = touch("/$fname",10,10);
if ($r===false)
   echo " FAILED ";
$stat = stat("/$fname");
print_r($stat);
$int = fileatime($fname);
$int2 = filemtime($fname);
echo "$int $int2";

stat() 返回这个数组:

(
    [0] => 15
    [1] => 0
    [2] => 33206
    [3] => 1
    [4] => 0
    [5] => 0
    [6] => 15
    [7] => 0
    [8] => 11
    [9] => 11
    [10] => 1570657454
    [11] => -1
    [12] => -1
    [dev] => 15
    [ino] => 0
    [mode] => 33206
    [nlink] => 1
    [uid] => 0
    [gid] => 0
    [rdev] => 15
    [size] => 0
    [atime] => 11
    [mtime] => 11
    [ctime] => 1570657454
    [blksize] => -1
    [blocks] => -1
)

但是 echo 打印创建时间:

1570657955 1570657955

我知道我可以使用 stat() 代替,但是为什么应该完成这项工作的函数对我不起作用?如果它对你有用,stat() 不是比 filemtime 慢吗?

【问题讨论】:

    标签: php filemtime


    【解决方案1】:

    使用filectime。对于 Windows,它将返回创建时间,而对于 Unix,更改时间是您可以获得的最佳时间,因为在 Unix 上没有创建时间(在大多数文件系统中)。

    <?php
    
    // outputs e.g.  somefile.txt was last changed: December 29 2018 22:16:23.
    
    $filename = 'somefile.txt';
    if (file_exists($filename)) {
        echo "$filename was last changed: " . date("F d Y H:i:s.", filectime($filename));
    }
    
    ?>
    

    【讨论】:

    • 无论如何,filemtime 似乎有问题。我阅读了 php 网站上的旧评论(8 年前)。 “Windows 下的 filemtime() 存在一个根深蒂固的问题,因为它调用了 Windows 的 stat() 函数,该函数实现了 DST(根据这个错误:bugs.php.net/bug.php?id=40568)。文件被当前系统的 CURRENT 时间当前是否在 DST 下感到困惑。“他在那里放了一些修复代码。
    • 此错误在 2007 年针对 PHP 5.2.1 报告,稍后在 PHP 5.3 中针对 ntfs 进行了修复,但 FAT 体积存在一些差异,因为脂肪体积在日光节约时间中不是恒定的。我相信 filectime 功能应该可以解决您的问题。
    【解决方案2】:

    达斯汀的 Oprea 解决方案:

    function GetCorrectMTime($filePath)
    {
    
        $time = filemtime($filePath);
    
        $isDST = (date('I', $time) == 1);
        $systemDST = (date('I') == 1);
    
        $adjustment = 0;
    
        if($isDST == false && $systemDST == true)
            $adjustment = 3600;
    
        else if($isDST == true && $systemDST == false)
            $adjustment = -3600;
    
        else
            $adjustment = 0;
    
        return ($time + $adjustment);
    } 
    

    在windows上测试并且工作正常。

    我还测试了 stat() 和这个函数测量的时间差,都显示为 0 微秒。

    对文件时间的 DST 检测被是否混淆 当前系统的 CURRENT 时间目前在 DST 下。 (达斯汀奥普雷亚)

    https://www.php.net/manual/en/function.filemtime.php

    修改版:

    function GetCorrectMTime($filePath)
    {
     static $init;
     $time = filemtime($filePath);
     $adjustment = 0;
     if ( $init === null ) 
      {
      $init = true;
      $isDST = (date('I', $time) == 1);
      $systemDST = (date('I') == 1);
      $adjustment = 0;
      if($isDST == false && $systemDST == true)
          $adjustment = 3600;
      else if($isDST == true && $systemDST == false)
          $adjustment = -3600;
      }
      return ($time + $adjustment);
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-21
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 2010-09-19
      • 2021-06-19
      • 2015-04-18
      相关资源
      最近更新 更多