PHP:DateTime'-1天';

PHP:DateTime'-1天';,php,datetime,Php,Datetime,我想获取特定时区中当前日期的昨天日期。 我试过这样做,但不起作用: $date = new DateTime(NULL, new DateTimeZone('Pacific/Wake')); $yesterday = $date->modify( '-1 day' ); $yesterday = $yesterday->format('Y-m-d'); 我仍在获取今天的日期。如果不不不必要地重新分配$date变量,它似乎会起作用。见下文: <?php $date =

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

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

我仍在获取今天的日期。

如果不不不必要地重新分配
$date
变量,它似乎会起作用。见下文:

<?php 
  $date = new DateTime(NULL, new DateTimeZone('Pacific/Wake'));
  $date->modify("-1 day");
  $date = $date->format("Y-m-d");
  // echo $date; // just in case you wanna echo - ya dig
?>

供参考:

威克岛时区(UTC+12:00)


这意味着前一天实际上是今天(至少对我来说,是在西半球)。

根据,这个问题似乎完全取决于您使用的php版本。根据前面链接的文档中的说明,在这种情况下,方法链接(您正试图做的就是调用)仅在php 5.3.0及以上版本上可用

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

$date = new DateTime(NULL, new DateTimeZone('Pacific/Wake')); 
$date = $date->modify( '-1 day' )->format('Y-m-d');
我意识到这并没有多大的改善,但这是你为什么失败的原因

下面是我看到的两种绕过这个问题的方法;一个是创建一个类。。这对我来说似乎太过分了,除非这是更伟大的事情的一部分。。。另一个是函数的创建。从某种意义上说,这两种方法都将多余的线条塞进了占用更少空间的地方

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);
}
两者的使用都很简单;就班级而言,应该是这样的

$dt = new DT('Pacific/Wake');
echo $dt->mod('-1 day', 'Y-m-d');
而在函数的情况下,它只是

echo mod_formatted_zone('Pacific/Wake', '-1 day', 'Y-m-d');
我想获取特定时区中当前日期的昨天日期

可以在DateTime构造函数中指定相对日期。这将对您有用:-

$yesterday = new DateTime('- 1 day', new DateTimeZone('Pacific/Wake'));
var_dump($yesterday);

.

您是否尝试过不再设置$date?只需创建一次对象,然后将新变量设置为该值?例如,
$date=newdatetime()$日期->修改();echo$date->format()。注;为了简洁起见,我遗漏了一些信息。换言之;我不知道DateTime是否是可链接的。问题似乎出在您的第一行代码中,所以请尝试删除
NULL,新的DateTimeZone('Pacific/Wake')
,读作
$date=new DateTime()或选择一个类似的时区。您也可以尝试添加
日期\默认\时区\设置('Pacific/Wake')或使用
echo“昨天是:”。日期(“Y-m-d”,标准时间(“昨天”)我应该回答:/哦,哇,哈哈,是的,发布一个,我会删除我的,我甚至没有notice@Daedalus在这里发表评论,当你发布它,所以我知道回来后这里leaving@Deryck离题:别那么谦虚。你确实花了时间发布了答案。你值得表扬;-)哈哈,我想我只是感觉不好。StackOverflow类似于CrackFuture上的肯塔基德比(Kentucky Derby of code Sprint),鉴于以上两行,您可以根据需要创建更多变量:
$date1=$date->modify(blahblah)->format(blah),等等。我一定喜欢链锁<代码>返回此
ftwThanks。但这在我的安装上不起作用。因此,我必须为我想要的每个日期(昨天、明天、星期一的日期等)创建一个新的日期时间,或者使用
date\u default\u timezone\u set('Pacific/Wake')设置它
并转到旧的
date()
函数。你的建议是什么?@yoshi嗯,我认为有两种方法可以做到这一点;要么创建一个类来保存变量和方法,要么创建一个简单的函数来返回这种类型的变量和方法,然后将所有的变量和方法填充到一行中。如果你想的话,我可以把两者都发出去。我把它们写下来了。