问题 PHP函数filemtime返回负值或非常大的值


我正在创建一个WordPress插件,可以在某些服务器上看到,对于某些文件, stat (要么 filemtime)返回无效 修改时间 值。在某些情况下,它是负值或非常大的值(超过30亿)。

在FTP中,我可以看到时间戳是正确的。


1210
2017-12-13 20:40


起源

+ 3bill不太可能,除非你使用的是64位系统。对于标准的32位时间戳,+ 3账单是不可能的,如果你在64位领域,则对应于~2065。 - Marc B
可能重复 stackoverflow.com/questions/11718772/... - Mike
......美国还是英国数十亿? - Wrikken
文件路径肯定是正确的。当我覆盖文件时,正确报告时间戳。我猜测30亿+与负值相关,其中最高阶位被错误地解释。我不遵循的是,最高位如何设置? - akshat
这应该会引发一些警告;你有error_reporting设置到最高级别? - Ja͢ck


答案:


当您在任何PHP时间戳中获得负数时,它只是Unix Epoch之前的秒数,并且不限于此 filemtime

例A

echo strtotime("1950-1-1"); // Outputs  -631155600
                                        ^------- negative value

例B

输出负值并不意味着如果您尝试,则无法正确格式化

echo date("Y-m-d",-631155600); // Output  1950-01-01

最后 

FTP I can see that the timestamp is correct though 

您的FTP应用程序绝对不是PHP并且有自己的内部日期系统..其日期系统可能不会在时间戳中使用负值


11
2017-12-17 10:13



这是一个非常古老的服务器,如果它在1970年之前修改了文件:) - Hugo Delsing
创建文件时,系统配置可能不正确 - Baba
你知道为什么时间戳变得非常大吗? - akshat
@akshat有多大...给出一个样本值 - Baba
@baba 3421738619这是我们得到的价值之一 - akshat


如果我理解正确的话,你正在寻找一个非常大的值 - 这是一个Unix时间戳。

你尝试过这样的事吗?

date ("F d Y H:i:s.", filemtime($filename))

filemtime 返回自1970年1月1日以来经过的秒数,这应该是一个非常大的值;你可以使用类似上面的例子将这些秒转换成人类可读的东西。

另一方面,如果你意识到这一点并且你认为你的大价值仍然是错误的,那么发布一个所述价值的例子以及你期望它的日期可能会有所帮助。


0
2017-12-13 20:44



很大,是的。超过30亿,没有。 - Niet the Dark Absol
如果我没有弄错的话,@ Kolink肯定不会超过30亿,但可能超过10亿。想象“30亿”可能是一个错误估计,如 filemtime 返回其他任何东西似乎不太 - username tbd
我知道时间戳是“自1970年以来的秒数”。但是,它不应该得到如此大的价值。例如,我得到的值:3421738619 - akshat


当您的服务器运行ntp守护程序时,这可能是在请求中设置时间的结果。这发生在e.x.对于apache日志和其他依赖于unix系统功能的东西。


0
2017-12-16 15:10





filemtime返回负值的文件大小是多少?

它在这里说: http://php.net/manual/en/function.stat.php “由于PHP的整数类型已签名且许多平台使用32位整数,因此某些文件系统函数可能会为大于2GB的文件返回意外结果。”


0
2017-12-19 11:38





unix时间戳的当前值约为1,356,197,722,因此十亿是合理的。

虽然这不太可能成为问题,但值得了解 http://php.net/manual/en/function.clearstatcache.php 并在调用filemtime()之前使用它。


0
2017-12-22 17:38