PHP:日期时间“-1 天”

yos*_*shi 2 php datetime

我想在特定时区中获取当前日期的昨天的日期。我试过这样,但它不工作:

$date = new DateTime(NULL, new DateTimeZone('Pacific/Wake')); 
$yesterday = $date->modify( '-1 day' );
$yesterday = $yesterday->format('Y-m-d');
Run Code Online (Sandbox Code Playgroud)

我仍然得到今天的日期。

Dae*_*ica 7

根据modify()方法文档,此问题似乎完全取决于您使用的 php 版本。在这种情况下,根据先前链接的文档上的更改日志,方法链接(这是您尝试执行的操作)仅在 php 5.3.0 及更高版本上可用。

考虑到这一点,它解释了为什么您的代码不起作用,而@Deryck 却起作用了。如果您曾经升级过 php 版本,或者让您的主机升级它,您可能会将这三行减少到两行:

$date = new DateTime(NULL, new DateTimeZone('Pacific/Wake')); 
$date = $date->modify( '-1 day' )->format('Y-m-d');
Run Code Online (Sandbox Code Playgroud)

我意识到这并没有太大的改进,但这是它失败的原因。

以下是我看到的两种解决方法;一个是创建一个类......对我来说这似乎有点矫枉过正,除非这是更宏伟的东西的一部分......另一个是创建一个函数。从某种意义上说,两者都将多余的线条推到了占用更少空间的地方。

class DT {
    private $now; //can be null
    private $timezone; //DateTimeZone object
    public function __construct($tz_str, $now = NULL) {
        $this->now = $now;
        $this->timezone = new DateTimeZone($tz_str);;
    }

    public function mod($mod,$format) {
      $dt = new DateTime($this->now, $this->timezone);
      $dt->modify($mod);
      return $dt->format($format);
    }
}

function mod_formatted_zone($tz_str, $mod, $format, $now = NULL) {
    $timezone = new DateTimeZone($tz_str);
    $dt = new DateTime($now,$timezone);
    $dt->modify($mod);
    return $dt->format($format);
}
Run Code Online (Sandbox Code Playgroud)

两者的使用都很简单;在类的情况下,它会像..

$dt = new DT('Pacific/Wake');
echo $dt->mod('-1 day', 'Y-m-d');
Run Code Online (Sandbox Code Playgroud)

而在函数的情况下,它只是..

echo mod_formatted_zone('Pacific/Wake', '-1 day', 'Y-m-d');
Run Code Online (Sandbox Code Playgroud)