【问题标题】:PHP add time issuePHP添加时间问题
【发布时间】:2014-03-16 22:33:12
【问题描述】:

我正在尝试将时间添加到特定文本文件的最后修改时间(其中 $filename 表示 textfile ),本质上是这个

$txt_time = date("Y-m-d H:i", filemtime($filename));
$add_time = $txt_time + [5minutes];

我试过了

$add_time = date_add($txt_time, new DateInterval("T5M"));

但这似乎不起作用 有什么想法吗?

【问题讨论】:

  • $add_time = $txt_time + [5minutes];
  • 我相信这应该可行。 return date("d", filemtime($file_to_read)你试过这样吗?
  • 您会惊讶于在 Google 的搜索输入中输入以下内容可以找到什么:"add 5 minutes to time php"
  • @Allendar 我没有接受过有关这些东西的正式培训,你所说的 OOP 是什么意思?面向对象编程?如果是这样,“使用 OOP”是什么意思?很抱歉,我不明白这一点
  • @Fred-ii- 当然我首先尝试了谷歌,大部分结果解释了如何将时间添加到当前时间,我的问题特别是添加时间到修改后的文件时间(这不当我使用我在谷歌上找到的传统方法来增加时间时似乎不起作用)

标签: php date add


【解决方案1】:

我认为你可以在date() 函数中添加分钟

$txt_time = date("Y-m-d H:i", strtotime(filemtime($filename).'+ 5 minutes'));

【讨论】:

  • 他们真的应该为 PHP 制作一个替代文档,其中所有程序性的东西都被删除了:P +1 tho
  • @Allendar 对于 90% 没有直接 OO 等效项的核心功能,这将毫无用处。由于filemtime() 返回一个普通整数,包括这种情况。 date_add 作为一个显式处理对象的过程函数的存在似乎没有必要。
  • 更重要的是,虽然它看起来很合理,但这个解决方案实际上并不起作用:filemtime() 将 Unix 时间戳作为整数返回,因此您最终将像 '1234567890+5 minutes' 这样的字符串传递给 strtotime ,这不会做任何非常有用的事情:codepad.viper-7.com/eiOa7M
  • 您可以通过额外调用date() 来修改此方法以使其工作,尽管它有点难看,特别是如果您将其全部放在一行中:date('Y-m-d H:i:s', strtotime(date('Y-m-d H:i:s', 1234567890) . '+5 minutes'));
【解决方案2】:

如 PHP 手册中所述,date_add()DateTime object 作为其第一个参数,但date() 返回一个string,所以不,您编写的代码将不起作用。

相反,您需要使用date_create_from_format()'U' 格式说明符从filemtime() 的返回值创建一个对象,这是一个整数Unix 时间戳。

$txt_time = date_create_from_format('U', filemtime($filename));
date_add($txt_time, new DateInterval("PT5M"));
echo date_format($txt_time, 'Y-m-d H:i:s');

但要小心! $txt_time 变量将被date_add 操作修改

您也可以使用相同代码的 OOP 版本,这样可以更清楚地说明发生就地修改的原因:

$txt_time = DateTime::create_from_format('U', filemtime($filename));
$txt_time->add(new DateInterval("PT5M"));
echo $txt_time->format('Y-m-d H:i:s');

如果您使用的是 PHP 5.5,则可以改为创建一个 DateTimeImmutable 对象,它将按照您最初的计划返回新值,而原始变量保持不变:

$txt_time = DateTimeImmutable::create_from_format('U', filemtime($filename));
$add_time = $txt_time->add(new DateInterval("PT5M"));
echo $add_time->format('Y-m-d H:i:s');

注意:您还为创建DateInterval 提供了稍微错误的格式,它应该始终以P 开头,所以应该是"PT5M"。我已经更新了上面的例子。

这里是a live demo,我在这里检查了代码的第一个版本是否正确运行。

【讨论】:

  • 间隔规范T5M 不存在,它不会起作用。应该是PT5M
  • @Glavić 我自己也发现了;我在没有测试的情况下从问题中复制了它,并且正要为此添加一个注释:)
【解决方案3】:

@IMSoP 我无法让您的建议发挥作用,虽然您的现场演示有效,但当我将它与实际的 filemtime($filename) 一起使用时,我无法让它发挥作用

@Fabio 你的建议让我走上了正确的道路,“+5 分钟”似乎有效,但当我使用 strtotime() 时却不行,而是能够让它以这种方式工作:

$add_time = date("Y-m-d H:i:s", filemtime($filename) + "300 seconds");

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多