103

Drupal CMS から出てくる日付オブジェクトを取り、1 日を引いて両方の日付を出力しようとしています。これが私が持っているものです

$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

そのため、元の日付オブジェクトが正常に出力される理由がわかりませんが、追加の日付オブジェクトを作成し、1 日を減算して変更しようとしていますが、それができないようです。出力は常に空白になります。

4

10 に答える 10

162

あなたが試すことができます:

print('Next Date ' . date('Y-m-d', strtotime('-1 day', strtotime($date_raw))));
于 2011-10-04T16:51:47.057 に答える
66
 date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) ));
于 2011-10-04T16:56:41.370 に答える
26

オブジェクト指向版

$dateObject = new DateTime( $date_raw );
print('Next Date ' . $dateObject->sub( new DateInterval('P1D') )->format('Y-m-d');
于 2013-08-06T13:57:01.563 に答える
26

ワンライナーオプションは次のとおりです。

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 エディター

于 2016-03-22T12:37:00.913 に答える
14

現在のコードが機能しない理由はわかりませんが、日付オブジェクトが特に必要ない場合は、次のように機能します。

$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);
于 2011-10-04T16:52:06.133 に答える
3

これはどうですか: 最初に UNIX タイムスタンプに変換し、60*60*24 (秒単位で正確に 1 日) を減算してから、そこから日付を取得します。

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

注: apokryfos が指摘したように、これは技術的には、25 時間または 23 時間のいずれかの日がある夏時間の変更によって延期されます。

于 2015-06-11T04:58:42.877 に答える