用PHP减去1天

td-*_*dev 71 php datetimeoffset

我正在尝试从Drupal CMS中取出一个日期对象,减去一天并打印出两个日期.这就是我所拥有的

$date_raw = $messagenode->field_message_date[0]['value'];

print($date_raw);

//this gives me the following string: 2011-04-24T00:00:00

$date_object = date_create($date_raw);

$next_date_object = date_modify($date_object,'-1 day');

print('First Date ' . date_format($date_object,'Y-m-d'));

//this gives me the correctly formatted string '2011-04-24'

print('Next Date ' . date_format($next_date_object,'Y-m-d'));

//this gives me nothing. The output here is always blank
Run Code Online (Sandbox Code Playgroud)

所以我不明白为什么原始日期对象出来很好,但后来我试图创建一个额外的日期对象并通过减去一天来修改它,似乎我不能那样做.输出总是空白.

Mas*_*sim 128

你可以试试:

print('Next Date ' . date('Y-m-d', strtotime('-1 day', strtotime($date_raw))));
Run Code Online (Sandbox Code Playgroud)

  • **小心!**如果你处理日期_超过2038_它将无法工作,因为PHP中的整数大小限制(至少在32位平台上).在这种情况下,最安全的解决方案是使用`DateTime`([见这里](http://stackoverflow.com/questions/5319710/accessing-dates-in-php-beyond-2038)). (4认同)

iTh*_*ink 59

 date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) ));
Run Code Online (Sandbox Code Playgroud)


abe*_*dat 23

$date = new DateTime("2017-05-18"); // For today/now, don't pass an arg.
$date->modify("-1 day");
echo $date->format("Y-m-d H:i:s");
Run Code Online (Sandbox Code Playgroud)

使用DateTime可以显着减少操作日期时忍受的头痛量.

  • [`date_create`](/sf/answers/2530820841/)是调用[`DateTime`构造函数]的过程方法(http://php.net/manual/en/datetime.construct. php),它允许你在不使用`new`的情况下将3行减少为1.即`echo date_create('2017-05-18') - >修改(' - 1天') - >格式('Ymd H:i:s');` (4认同)
  • 好吧,原始 asnwer 中的代码也可以写在 1 行中,例如: `(new \DateTime("2017-05-18"))->modify("-1 day")->format("Ymd H:我:s")` (4认同)

Cos*_*tar 19

面向对象的版本

$dateObject = new DateTime( $date_raw );
print('Next Date ' . $dateObject->sub( new DateInterval('P1D') )->format('Y-m-d');
Run Code Online (Sandbox Code Playgroud)


Arm*_*oot 14

一个一行程序选项是:

echo date_create('2011-04-24')->modify('-1 days')->format('Y-m-d');
Run Code Online (Sandbox Code Playgroud)

在线PHP编辑器上运行它.


mktime替代方案

如果您希望避免使用字符串方法,或进行计算,甚至创建其他变量,mktime将通过以下方式支持减法和负值:

// Today's date
echo date('Y-m-d'); // 2016-03-22

// Yesterday's date
echo date('Y-m-d', mktime(0, 0, 0, date("m"), date("d")-1, date("Y"))); // 2016-03-21

// 42 days ago
echo date('Y-m-d', mktime(0, 0, 0, date("m"), date("d")-42, date("Y"))); // 2016-02-09

//Using a previous date object
$date_object = new DateTime('2011-04-24');
echo date('Y-m-d',
  mktime(0, 0, 0,
     $date_object->format("m"),
     $date_object->format("d")-1,
     $date_object->format("Y")
    )
); // 2011-04-23
Run Code Online (Sandbox Code Playgroud)

在线PHP编辑器


Cli*_*ive 12

不确定为什么你当前的代码不工作,但如果你不特别需要一个日期对象,这将工作:

$first_date = strtotime($date_raw);
$second_date = strtotime('-1 day', $first_date);

print 'First Date ' . date('Y-m-d', $first_date);
print 'Next Date ' . date('Y-m-d', $second_date);
Run Code Online (Sandbox Code Playgroud)


use*_*723 6

怎么样:首先将其转换为 unix 时间戳,减去 60 60 24(正好是一天,以秒为单位),然后从中获取日期。

$newDate = strtotime($date_raw) - 60*60*24;
echo date('Y-m-d',$newDate);
Run Code Online (Sandbox Code Playgroud)

正如 apokryfos 指出的那样:请注意,这会减去实际的一天,但如果您所在的地方实行夏令时,那么如果您需要一天中的同一个小时,可能会导致问题。但是,您不应该在您的服务器上使用除 UTC 之外的任何东西!从技术上讲,闰秒也可能存在问题


小智 6

就这么简单:

date("Y-m-d", strtotime("-1 day"));

date("Y-m-d", strtotime("-1 months"))


小智 5

摘自Php手册strtotime函数注释:

echo date( "Y-m-d", strtotime( "2009-01-31 -1 day"));
Run Code Online (Sandbox Code Playgroud)

要么

$date = "2009-01-31";
echo date( "Y-m-d", strtotime( $date . "-1 day"));
Run Code Online (Sandbox Code Playgroud)