<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>DateTime Arithmetic</title> </head> <body><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="datetime.examples.html">Examples</a></div> <div class="next" style="text-align: right; float: right;"><a href="class.datetime.html">DateTime</a></div> <div class="up"><a href="datetime.examples.html">Examples</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div><hr /><div id="datetime.examples-arithmetic" class="section"> <h2 class="title">DateTime Arithmetic</h2> <p class="para"> The following examples show some pitfalls of DateTime arithmetic with regard to DST transitions and months having different numbers of days. </p> <p class="para"> <div class="example" id="example-2736"> <p><strong>Example #1 DateTime::add/sub add intervals which cover elapsed time</strong></p> <div class="example-contents"><p> Adding PT24H over a DST transition will appear to add 23/25 hours (for most timezones). </p></div> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br />$dt </span><span style="color: #007700">= new </span><span style="color: #0000BB">DateTime</span><span style="color: #007700">(</span><span style="color: #DD0000">"2015-11-01 00:00:00"</span><span style="color: #007700">, new </span><span style="color: #0000BB">DateTimeZone</span><span style="color: #007700">(</span><span style="color: #DD0000">"America/New_York"</span><span style="color: #007700">));<br />echo </span><span style="color: #DD0000">"Start: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">"Y-m-d H:i:s P"</span><span style="color: #007700">), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">add</span><span style="color: #007700">(new </span><span style="color: #0000BB">DateInterval</span><span style="color: #007700">(</span><span style="color: #DD0000">"PT3H"</span><span style="color: #007700">));<br />echo </span><span style="color: #DD0000">"End: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">"Y-m-d H:i:s P"</span><span style="color: #007700">), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> Start: 2015-11-01 00:00:00 -04:00 End: 2015-11-01 02:00:00 -05:00 </pre></div> </div> </div> </p> <p class="para"> <div class="example" id="example-2737"> <p><strong>Example #2 DateTime::modify and strtotime increment or decrement individual component values</strong></p> <div class="example-contents"><p> Adding +24 hours over a DST transition will add exactly 24 hours as seen in the date/time string (unless the start or end time is on a transition point). </p></div> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br />$dt </span><span style="color: #007700">= new </span><span style="color: #0000BB">DateTime</span><span style="color: #007700">(</span><span style="color: #DD0000">"2015-11-01 00:00:00"</span><span style="color: #007700">, new </span><span style="color: #0000BB">DateTimeZone</span><span style="color: #007700">(</span><span style="color: #DD0000">"America/New_York"</span><span style="color: #007700">));<br />echo </span><span style="color: #DD0000">"Start: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">"Y-m-d H:i:s P"</span><span style="color: #007700">), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">modify</span><span style="color: #007700">(</span><span style="color: #DD0000">"+24 hours"</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"End: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">"Y-m-d H:i:s P"</span><span style="color: #007700">), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> Start: 2015-11-01 00:00:00 -04:00 End: 2015-11-02 00:00:00 -05:00 </pre></div> </div> </div> </p> <p class="para"> <div class="example" id="example-2738"> <p><strong>Example #3 Adding or subtracting times can over- or underflow dates</strong></p> <div class="example-contents"><p> Like where January 31st + 1 month will result in March 2nd (leap year) or 3rd (normal year). </p></div> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"Normal year:\n"</span><span style="color: #007700">; </span><span style="color: #FF8000">// February has 28 days<br /></span><span style="color: #0000BB">$dt </span><span style="color: #007700">= new </span><span style="color: #0000BB">DateTime</span><span style="color: #007700">(</span><span style="color: #DD0000">"2015-01-31 00:00:00"</span><span style="color: #007700">, new </span><span style="color: #0000BB">DateTimeZone</span><span style="color: #007700">(</span><span style="color: #DD0000">"America/New_York"</span><span style="color: #007700">));<br />echo </span><span style="color: #DD0000">"Start: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">"Y-m-d H:i:s P"</span><span style="color: #007700">), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">modify</span><span style="color: #007700">(</span><span style="color: #DD0000">"+1 month"</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"End: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">"Y-m-d H:i:s P"</span><span style="color: #007700">), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"Leap year:\n"</span><span style="color: #007700">; </span><span style="color: #FF8000">// February has 29 days<br /></span><span style="color: #0000BB">$dt </span><span style="color: #007700">= new </span><span style="color: #0000BB">DateTime</span><span style="color: #007700">(</span><span style="color: #DD0000">"2016-01-31 00:00:00"</span><span style="color: #007700">, new </span><span style="color: #0000BB">DateTimeZone</span><span style="color: #007700">(</span><span style="color: #DD0000">"America/New_York"</span><span style="color: #007700">));<br />echo </span><span style="color: #DD0000">"Start: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">"Y-m-d H:i:s P"</span><span style="color: #007700">), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">modify</span><span style="color: #007700">(</span><span style="color: #DD0000">"+1 month"</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"End: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">"Y-m-d H:i:s P"</span><span style="color: #007700">), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> Normal year: Start: 2015-01-31 00:00:00 -05:00 End: 2015-03-03 00:00:00 -05:00 Leap year: Start: 2016-01-31 00:00:00 -05:00 End: 2016-03-02 00:00:00 -05:00 </pre></div> </div> <div class="example-contents"><p> To get the last day of the next month (i.e. to prevent the overflow), the <em>last day of</em> format is available as of PHP 5.3.0. </p></div> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"Normal year:\n"</span><span style="color: #007700">; </span><span style="color: #FF8000">// February has 28 days<br /></span><span style="color: #0000BB">$dt </span><span style="color: #007700">= new </span><span style="color: #0000BB">DateTime</span><span style="color: #007700">(</span><span style="color: #DD0000">"2015-01-31 00:00:00"</span><span style="color: #007700">, new </span><span style="color: #0000BB">DateTimeZone</span><span style="color: #007700">(</span><span style="color: #DD0000">"America/New_York"</span><span style="color: #007700">));<br />echo </span><span style="color: #DD0000">"Start: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">"Y-m-d H:i:s P"</span><span style="color: #007700">), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">modify</span><span style="color: #007700">(</span><span style="color: #DD0000">"last day of next month"</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"End: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">"Y-m-d H:i:s P"</span><span style="color: #007700">), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"Leap year:\n"</span><span style="color: #007700">; </span><span style="color: #FF8000">// February has 29 days<br /></span><span style="color: #0000BB">$dt </span><span style="color: #007700">= new </span><span style="color: #0000BB">DateTime</span><span style="color: #007700">(</span><span style="color: #DD0000">"2016-01-31 00:00:00"</span><span style="color: #007700">, new </span><span style="color: #0000BB">DateTimeZone</span><span style="color: #007700">(</span><span style="color: #DD0000">"America/New_York"</span><span style="color: #007700">));<br />echo </span><span style="color: #DD0000">"Start: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">"Y-m-d H:i:s P"</span><span style="color: #007700">), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">modify</span><span style="color: #007700">(</span><span style="color: #DD0000">"last day of next month"</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"End: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$dt</span><span style="color: #007700">-></span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">"Y-m-d H:i:s P"</span><span style="color: #007700">), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> Normal year: Start: 2015-01-31 00:00:00 -05:00 End: 2015-02-28 00:00:00 -05:00 Leap year: Start: 2016-01-31 00:00:00 -05:00 End: 2016-02-29 00:00:00 -05:00 </pre></div> </div> </div> </p> </div><hr /><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="datetime.examples.html">Examples</a></div> <div class="next" style="text-align: right; float: right;"><a href="class.datetime.html">DateTime</a></div> <div class="up"><a href="datetime.examples.html">Examples</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div></body></html>