PHPで1日減算


83

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日を引いて変更しようとしていますが、それができないようです。出力は常に空白になります。

回答:


147

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

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

1
$ date_rawと同じ形式を次のように取得できます$date_raw = date("r");
sHaDeoNeR 2015年

5
注意してください!2038を超える日付処理する場合、PHPの整数サイズの制限のために機能しません(少なくとも32ビットプラットフォームでは)。その場合、最も安全な解決策はを使用することですDateTimeここを参照)。
ヒント-2016年


36
$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_createDateTimeコンストラクターを呼び出す手続き型メソッドです。これにより、を使用せずに3行を1行に減らすことができますnew。つまりecho date_create('2017-05-18')->modify('-1 day')->format('Y-m-d H:i:s');
アームフット2018

:よく、元asnwerからコードも同様に、1行で書くことができる(new \DateTime("2017-05-18"))->modify("-1 day")->format("Y-m-d H:i:s")
スコフィールド

22

オブジェクト指向バージョン

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

あなたの答えはそれを差し引く代わりに1日を追加します。それ以外は、それが私の好ましい解決策になるでしょう。
ビュルキ2015

18

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

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


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

4

そのような単純な:

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

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


3

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

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

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


良いものです。私だけが次のようにしました:$ newDate = date_create($ date_raw)-> getTimestamp()-60 * 60 * 24;
Yevgeniy Afanasyev 2015

これは、すべての日が24時間の長さであることを前提としています。これは、世界の少数派が時計を+/- 1時間動かして、多かれ少なかれ日光の錯覚を与える2日間には当てはまりません。そして、うるう秒もあります。
apokryfos 2016

それは素晴らしいキャッチ@apokryfosです。私はこれを超科学的な計算には使用しませんが、ほとんどの場合、それでも問題ないはずです。
user3413723 2016

-1

日付に1年を加算し、asp.net c#でそれから1日を減算する方法

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

これはPHPではありません。
atheaos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.