日付に1日を追加する


172

日付に1日を追加する私のコードは、日を追加する前の日付を返します。1日を追加した後の日付は、 2009-09-30 20:24:00翌月にロールオーバーする必要があります。1970-01-01 17:33:29

<?php

    //add day to date test for month roll over

    $stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00"));

    echo 'date before day adding: '.$stop_date; 

    $stop_date = date('Y-m-d H:i:s', strtotime('+1 day', $stop_date));

    echo ' date after adding one day. SHOULD be rolled over to the next month: '.$stop_date;
?>

以前に非常によく似たコードを使用したことがありますが、ここで何が問題になっていますか?

回答:


333
<?php
$stop_date = '2009-09-30 20:24:00';
echo 'date before day adding: ' . $stop_date; 
$stop_date = date('Y-m-d H:i:s', strtotime($stop_date . ' +1 day'));
echo 'date after adding 1 day: ' . $stop_date;
?>

PHP 5.2.0以降の場合、次のようにすることもできます。

$stop_date = new DateTime('2009-09-30 20:24:00');
echo 'date before day adding: ' . $stop_date->format('Y-m-d H:i:s'); 
$stop_date->modify('+1 day');
echo 'date after adding 1 day: ' . $stop_date->format('Y-m-d H:i:s');

3
ありがとう。次のように解決します:$ stop_date = date( 'Ymd H:i:s'、strtotime( "$ stop_date + 1 day"));
イアン・

11
文字列では変数を使用しないでください。あなたが使うべきです:date('Y-m-d H:i:s', strtotime($stop_date . ' + 1 day'));@ w35l3yがあなたに与えた答えのように。
Cas Bloem 14

このコードを実行する前に、date_default_timezone_set関数の呼び出しを追加する必要があります。たとえば、date_default_timezone_set( 'Europe / Rome');を追加します。
Luca Mastrostefano 2017

96
$date = new DateTime('2000-12-31');

$date->modify('+1 day');
echo $date->format('Y-m-d') . "\n";

6
これはより最近の-完全な-解決策です。
Cas Bloem 14

...ホスト上で実行しても致命的なエラーが発生しない限り;)
Henrik Erlandsson

謝らないでください。一部の人々はあなたがした3年後のダムの答えを投稿しました
モーグはモニカ

1
このコードを実行する前に、date_default_timezone_set関数の呼び出しを追加する必要があります。たとえば、date_default_timezone_set( 'Europe / Rome');を追加します。
Luca Mastrostefano 2017

@LucaMastrostefanoいいえ、サーバーにタイムゾーンを設定しておく必要があります...
MH

28

最も簡単なソリューション:

$date = new DateTime('+1 day');
echo $date->format('Y-m-d H:i:s');

私はワンライナーであなたのやり方が好きですecho (new DateTime('+1 day'))->format('Y-m-d H:i:s');
Aba

@Aba私はそれを試してみましたが、私はエラーを得たので、あなたの1つのライナーはPHPの古いバージョンで動作するとは思わない:Unexpected T_OBJECT_OPERATOR” error in PHP
ザカリーWeixelbaum

25

それは私のために働きました:現在の日付のために

$date = date('Y-m-d', strtotime("+1 day"));

anydateの場合:

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

2
ありがとうございます。与えられたすべてのソリューションの中で最も単純です。
Puneet Verma 2017

2
あなたは、繰り返しネストする必要はありませんstrtotime()-それは1回の呼び出しですべてを処理することができますdate('Y-m-d', strtotime($date . " +1 day"));
billynoah

2
いいですね、これが最も簡単な解決策です!ありがとう
Angel


6

読みやすく理解しやすい方法:

$original_date = "2009-09-29";

$time_original = strtotime($original_date);
$time_add      = $time_original + (3600*24); //add seconds of one day

$new_date      = date("Y-m-d", $time_add);

echo $new_date;

3
日の長さが24時間ではない場合、夏時間の変更時にこれが失敗することがあります。
Nik Dow

3

私は常に86400(1日の秒数)を追加するだけです。

$stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00") + 86400);

echo 'date after adding 1 day: '.$stop_date; 

それはおそらくあなたがそれを行うことができる最も滑らかな方法ではありませんが、それはうまくいきます!


その日に86401秒があるため86400を追加しても機能しない場合、うるう秒をどのように処理しますか?(わかりました、数年おきにしか起こりませんが、アプリによってはこれが重要になる場合があります)
Glen

1
すべての日に86400秒があるわけではありません。実際、米国のほとんどの場所で、年に2回、3600秒少ない、または追加されています。
Peter Kovacs

1
「Unix時間」はそうするので、うるう秒は無視しても安全です。これはやや複雑、より多くの情報のため、この記事を読んでされていますderickrethans.nl/leap_seconds_and_what_to_do_with_them.php
クリスチャンDavén

2
このソリューションは避けてください。:ここに理由ですstackoverflow.com/questions/2613338/...
mspirは

1
前日に86400秒を追加して日付を追加しないでください。あなたのコードにバグがあります!これは夏時間の日には機能しません!
sbrbot 2012年

1

Doug Haysの答えには同意しますが、コードが機能しない理由はstrtotime()が2番目の引数として文字列ではなくINTを期待している日付を表すものでも)。

最大エラーレポートをオンにすると、これはE_NOTICEレベルの「整形式でない数値」エラーとして表示されます。


1

modify()既存に増分を追加するために使用することができる方法DateTime値。

DateTime現在の日付と時刻で新しいオブジェクトを作成します。

$due_dt = new DateTime();

あなたが持ってたらDateTime、オブジェクトを、あなたは、期間を加算または減算することによって、その値を操作することができます。

$due_dt->modify('+1 day');

詳細については、PHPマニュアルを参照してください


0

次のコードは、現在の年の1月の最初の日(ただし別の日付の場合もあります)を取得し、DateTimeクラスとそのメソッドmodify()およびformat( ):

echo (new DateTime((new DateTime())->modify('first day of January this year')->format('Y-m-d')))->modify('+365 days')->format('Y-m-d');

0

コードのどこに問題があるかについてはすでに回答が得られているので、一般的にdatetimeを操作して、具体的に問題を解決する方法について別の見方をすることができます。

多くの場合、解決策の点で問題を提起していることに気づきます。これは、命令型コードを作成する理由の1つにすぎません。それがうまくいけば素晴らしいです。他にも、おそらくより保守可能な代替案があります。それらの1つは宣言型コードです。重要なのは、そこに到達する方法ではなく、必要なものを尋ねることです。

特定のケースでは、これは次のようになります。最初に、を探しているのか、つまり抽象化を発見する必要があります。あなたの場合、日付が必要なようです。日付だけでなく、標準的な表現を持つ日付。ISO8601の日付を言ってください。少なくとも2つの実装があります。最初の実装はISO8601形式の文字列(または実際には他の形式の文字列)から解析された日付で、2番目の実装は1日後の将来の日付です。したがって、コード全体は次のようになります。

(new Future(
    new DateTimeParsedFromISO8601('2009-09-30 20:24:00'),
    new OneDay()
))
    ->value();

日時ジャグリングとその他の例については、チェックアウトこれを

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