用PHP减去一天

122

我正在尝试获取一个从我的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

我不明白为什么原始日期对象正常显示,但是当我尝试创建一个额外的日期对象并通过减去一天来修改它时,似乎我无法这样做。输出总是空白。

9个回答

180

你可以尝试:

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

1
你可以通过 $date_raw = date("r"); 获取与 $date_raw 相同的格式。 - sHaDeoNeR
11
注意!如果你处理的日期超过2038年,由于PHP在32位平台上的整数大小限制,它将无法工作。在这种情况下,最安全的解决方案是使用DateTime请参见此处)。 - Tip-Sy

75
$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类显著减少了在操作日期时所遭受的头疼。


8
date_create是调用DateTime构造函数的过程化方法,它允许您将3行代码简化为1行而不使用new关键字。例如:echo date_create('2017-05-18')->modify('-1 day')->format('Y-m-d H:i:s'); - Armfoot
4
原回答中的代码也可以写成一行,如下所示:(new \DateTime("2017-05-18"))->modify("-1 day")->format("Y-m-d H:i:s") - Scofield

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

30

一个一行代码选项是:

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

在线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

在线PHP编辑器


28

面向对象版本

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

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

17

不确定为什么您当前的代码无法正常工作,但如果您不需要一个特定的日期对象,这将起作用:

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

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

14

从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"));

12
您可以在date()中添加strtotime(),并设置参数为天、周或月的数量。
例如,对于一天的示例:
date("Y-m-d", strtotime("-1 day"));

一周:

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

一个月:

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

6
这样怎么样:先将它转换为Unix时间戳,然后减去606024(即一天的秒数),然后从中获取日期。
$newDate = strtotime($date_raw) - 60*60*24;
echo date('Y-m-d',$newDate);

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

不错,只是我把它写成了这样:$newDate = date_create($date_raw)->getTimestamp() - 606024; - Yevgeniy Afanasyev
这假设所有的日子都是24小时长,但在世界上少数人将他们的时钟移动+/- 1小时以提供更多或更少阳光 illusio 的2天中并不是真实的。还有闰秒的问题。 - apokryfos
这是个很好的发现@apokryfos。虽然我不会在超级科学计算中使用它,但在绝大多数情况下,它应该还是可以的。 - user3413723

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接