2013-10-24 34 views
0

是否可以更改系统日期为PHP(只)。 我想要这个用于调试/测试目的。是否可以更改系统日期为PHP(只)

//Test 1 (2010-01-01) 
$datetime = new DateTime(); //(2010-01-01) 

//Test 2 (2010-02-01) 
$datetime = new DateTime(); //(2010-02-01) 

我真的不能改变实际的系统时钟,因为其他开发商都在同一系统上工作(以及我可以,但仍然)。 我只是希望这是可能的,或者有人知道一个很好的窍门。

当我打印的phpinfo();我看到下面的一行:

Timezone Database internal 

也许是多变的,以类似“手册”的广告与+ 120

由于时区!

+2

这是一个很好的使用虚拟机的每个开发人员的使用案例... – feeela

+0

是的,但事实并非如此=) –

+0

所以,你问,如果可能,因为我告诉你在我的答案是,答案是否定的,它不可能以某种方式,你想要的。 – Legionar

回答

3

这听起来像一个密封的问题 - 为什么不搜索所有提及日期()或时间(的),并与定点$> getDisplayedDate(取代他们),还是其他什么东西适合你的代码?

我觉得你的痛苦,但我不认为有任何的方式来做到这一点。想一想这种方式......如果在一些不相关的代码中,你称之为time(),并且它将在未来3周内给你一些日期,你会有什么感觉?

只能更改时区(和ofcourse只有几个小时的前进/后退,而不是整天前锋),但那不是正确的解决方案......

+0

代码是好,没有任何问题,所以我没有看到一个理由去改变它。 这是真正的测试目的和“飞”时间,所以我可以刷新我的网页,日期是1个月进一步 我正在考虑改变时区为+120小时 –

+2

我不这么认为,你可以改变时区为+120小时... – Legionar

+0

然后我需要另一种解决方案=)谢谢! –

2

你可以创建自己的DateTime类,扩展了默认DateTime因此改变行为:

<?php 
    class CustomDateTimeVariables { 
     public static $date = 'now'; 
    } 

    class CustomDateTime extends DateTime { 
     public function __construct($time = null, DateTimeZone $timezone = null) { 
      if ($time === null) { 
       $time = CustomDateTimeVariables::$date; 
      } 
      if ($timezone !== null) { 
       parent::__construct($time, $timezone); 
      } else { 
       parent::__construct($time); 
      } 
     } 
    } 

    CustomDateTimeVariables::$date = '2010-01-01'; 
    $datetime1 = new CustomDateTime(); 

    CustomDateTimeVariables::$date = '2010-01-02'; 
    $datetime2 = new CustomDateTime(); 

    var_dump($datetime1->Format('Y-m-d H:i:s')); //"2010-01-01 00:00:00" 
    var_dump($datetime2->Format('Y-m-d H:i:s')); //"2010-01-02 00:00:00" 
?> 

DEMO

这种方式,您还可以设置默认的时间很容易(检查CustomDateTimeVariables ):

<?php 
    class CustomDateTimeVariables { 
     public static $date = 'now +120 hours'; 
    } 

    class CustomDateTime extends DateTime { 
     public function __construct($time = null, DateTimeZone $timezone = null) { 
      if ($time === null) { 
       $time = CustomDateTimeVariables::$date; 
      } 
      if ($timezone !== null) { 
       parent::__construct($time, $timezone); 
      } else { 
       parent::__construct($time); 
      } 
     } 
    } 

    $datetime = new CustomDateTime(); 

    var_dump($datetime->Format('Y-m-d H:i:s')); //"2013-10-29 13:37:39" 
?> 

..和当它上线,你可以简单地更改默认回now

+0

这是可能的,但我认为这不是一个好的解决方案。因为它需要更改所有DateTime用于测试功能的地方 –

+0

@SanderVisser我同意你的观点 - 这里没有真正的“漂亮”方式,但这种方式是唯一可以通过简单批量修复的方法“找到/替换“的所有代码。 – h2ooooooo

+0

我希望有一种方法来改变时区数据库。像 add_timezone( “调试/ 1区”, “+ 1200”); –