用PHP减去1天

用PHP减去1天,php,datetimeoffset,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_mo

我试图从我的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
所以我不明白为什么原始的日期对象表现得很好,但是我试图创建一个额外的日期对象,并通过减去一天来修改它,但似乎我做不到。输出结果总是为空。

您可以尝试:

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

不确定当前代码为何不起作用,但如果您不特别需要日期对象,则可以:

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

面向对象版本

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

这样如何:首先将其转换为unix时间戳,减去60*60*24(正好是秒中的一天),然后从中获取日期

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

注:正如apokryfos所指出的,这在技术上会被夏令时的变化所抵消,在夏令时的变化中,一天有25小时或23小时

a一行选项是:

echo date_create('2011-04-24')->modify('-1 days')->format('Y-m-d');
在上面运行它。

可供替代的 如果您希望避免使用字符串方法,或进行计算,甚至创建其他变量,则支持以下方式的减法和负值:

// 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

使用DateTime可以显著减少在处理日期时遇到的麻烦。

如何在asp.net c中为日期加上1年,然后减去1天。


Answear摘自Php手动strotime函数注释:

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

简单地说:

日期(“Y-m-d”,标准时间(“-1天”)


日期(“Y-m-d”,标准时间(“1个月”)

谢谢克莱夫!这一个对我很有用…是的,我并不真的需要日期对象,我只需要打印格式化的日期小心!如果处理2038年以后的日期,由于PHP中的整数大小限制(至少在32位平台上),它将不起作用。在这种情况下,最安全的解决方案是使用
DateTime
()。好的解决方案,只有我这样做:$newDate=date\u create($date\u raw)->getTimestamp()-60*60*24;这假设所有的日子都是24小时长的,这在世界上少数人将时钟移动+/-1小时以提供或多或少阳光的错觉的那两天是不正确的。还有闰秒。这是一个伟大的捕获@apokryfos。我不会用它来进行超级科学的计算,但在绝大多数情况下,它应该还是可以的。你的答案是加一天而不是减一天。除此之外,这将是我的首选解决方案。是调用的过程方法,它允许您将3行减少为1行,而无需使用
new
。即
echo date_创建('2017-05-18')->修改('1天')->格式('Y-m-d H:I:s')好的,来自原始asnwer的代码也可以写成一行,比如:
(new\DateTime(“2017-05-18”)->modify(“-1天”)->格式(“Y-m-dh:i:s”)
这不是PHP。
$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");
Convert.ToDateTime(txtDate.Value.Trim()).AddYears(1).AddDays(-1);
echo date( "Y-m-d", strtotime( "2009-01-31 -1 day"));
$date = "2009-01-31";
echo date( "Y-m-d", strtotime( $date . "-1 day"));