用PHP减去1天


80

我试图从我的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

因此,我不明白为什么原始日期对象会很好,但是随后我试图创建另一个日期对象并通过减去一天来对其进行修改,看来我无法做到这一点。输出总是空白。

Answers:


145

你可以试试:

print('Next Date ' . date('Y-m-d', strtotime('-1 day', strtotime($date_raw))));

1
您可以通过$date_raw = date("r");
sHaDeoNeR 2015年

4
小心!如果您处理的日期超过2038,则由于PHP中的整数大小限制(至少在32位平台上),该日期将无效。在这种情况下,最安全的解决方案是使用DateTime请参阅此处)。
Tip-Sy 2016年

60
 date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) ));

31
$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");

使用DateTime可以显着减少操纵日期时遭受的头痛。


6
date_create是调用DateTime构造函数的程序方法,它使您可以在不使用的情况下将3行减少为1行new。即echo date_create('2017-05-18')->modify('-1 day')->format('Y-m-d H:i:s');
Armfoot

22

面向对象的版本

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

您的答案会增加一天而不是减去一天。除此之外,这将是我的首选解决方案。
Burki

17

一个一行程序选项是:

echo date_create('2011-04-24')->modify('-1 days')->format('Y-m-d');

Online PHP Editor上运行它。


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

在线PHP编辑器


13

不确定为什么您当前的代码不起作用,但是如果您不特别需要日期对象,它将起作用:

$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);

谢谢克莱夫!那对我有用...是的,我真的不需要日期对象,只需要打印格式化的日期。
td-dev

7

摘自Php手册strtotime函数注释:

echo date( "Y-m-d", strtotime( "2009-01-31 -1 day"));

要么

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

3

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

$newDate = strtotime($date_raw) - 60*60*24;
echo date('Y-m-d',$newDate);

注意:正如apokryfos所指出的那样,从技术上讲,这将被夏令时更改所抵消,因为夏令时的更改可能会导致一天花费25或23个小时


好,只有我这样子:$ newDate = date_create($ date_raw)-> getTimestamp()-60 * 60 * 24;
Yevgeniy Afanasyev 2015年

假设所有日子都是24小时长,而在世界上少数人将时钟调动+/- 1小时以提供或多或少的阳光错觉的那两天中,情况并非如此。然后还有s秒。
apokryfos

@apokryfos很棒。我不会将其用于超级科学的计算,但是在大多数情况下,它应该还不错。
user3413723

2

像这样简单:

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

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


-1

如何在日期中添加1年然后在asp.net中从中减去1天C#

Convert.ToDateTime(txtDate.Value.Trim()).AddYears(1).AddDays(-1);

这不是PHP。
atheaos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.