PHP - 设置/模拟假日期

时间:2013-05-10 11:39:28

标签: php date

我有点奇怪的问题。是否可以在脚本工作的时间在PHP中设置假日期?我正在使用使用时间段的API,例如当您发送获取某些数据的请求时,您可以指定时间段(例如一个月,但这些时间段是固定的),并且它会将request_time-1month的结果返回到request_time。显然,请求数据是当前时间,因此我想模拟当前时间(例如设置日期从5月10日到4月15日)。可能吗?我在PHP文档中看不到任何有用的东西,我甚至不知道它是否可行,因为我不确定这个API是否使用来自服务器的工作时间或存储上述数据的独立服务器。但也许有人有任何想法。

先谢谢。

5 个答案:

答案 0 :(得分:14)

使用libfaketime(https://github.com/wolfcw/libfaketime)。在ubuntu上 - 只需使用apt-get或aptitude安装faketime。

  1. 如果您想假装控制台应用的时间:

    LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 FAKETIME="2008-01-01 00:00:00" php yourscript.php
    
  2. 如果你想伪造apache时间,你需要在预先加载libfaketime的情况下启动apache。只需加上

    export FAKETIME="2008-01-01 00:00:00"
    export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
    
  3. 进入/ etc / apache2 / envvars并重启apache。现在,您的服务器响应将始终如下

    $ curl -D - http://localhost
    HTTP/1.1 200 OK
    Date: Tue, 01 Jan 2008 00:00:00 GMT
    Server: Apache/2.2.22 (Ubuntu)
    Last-Modified: Tue, 01 Jan 2008 00:00:00 GMT
    ETag: W/"420419-b1-4429c2a6653ac"
    Accept-Ranges: bytes
    Content-Length: 177
    Vary: Accept-Encoding
    Content-Type: text/html
    

答案 1 :(得分:2)

如果您要连接的API使用“request_time - 1个月”,那么您的脚本认为时间是不相关的,只有 API后面的脚本的时间认为是。 (作为一个愚蠢的比喻:如果一家商店在下午5点关闭,提早设置你的手表将不会让你在5:30;你需要潜入并更换墙上的时钟,以便工作人员不会锁定向上。)

因此,除非您能找到一种方法来欺骗远程API以为您在不同时间发送请求,否则您无能为力。

如果您控制API,那么只需编辑API以获得一个超越“now”定义的参数,也许只允许在特殊调试模式下使用。

答案 2 :(得分:1)

实际上,您通过PHP访问的日期和时间是服务器的系统时间。因此,如果您能够改变它,您就可以实现您的需求。看看这个答案:https://stackoverflow.com/a/3923946/977431

虽然就个人而言,我建议只使用从当前日期返回-30天(例如)的函数。如果您想更改日期,请将该函数替换为真实的getdate()

答案 3 :(得分:0)

你到底想要做什么?如果您正在测试某些内容,则根本不应该依赖系统配置 - 更好地执行以下操作:

my_function(\DateTime $now = null) {

  if($now === null) {
      return new \DateTime();
  } else {
      return $now;
  }

}

在普通代码中,您只需拨打my_function(),但在测试中,请致电

$now = \DateTime::createFromFormat(...);
my_function($now);

类似的想法,如果它是生产代码。将日期作为参数传递,而不是让函数得到它。

my_function(\DateTime $datetime) {
  // does stuff
}
call_my_function() {
  my_function(new \DateTime());
}
other_way_to_call_my_function() {
  $datetime = \DateTime::createFromFormat(...);
  my_function($datetime);
}

答案 4 :(得分:0)

这对我有用:

apt-get install faketime
faketime '2021-04-26 08:15:42' php cron.php