<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>&#60;?blog &#187; porównywanie dat</title>
	<atom:link href="http://blog.visionsoftware.pl/tag/porownywanie-dat/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.visionsoftware.pl</link>
	<description>...nie tylko o programowaniu</description>
	<lastBuildDate>Sun, 23 Mar 2014 19:23:43 +0000</lastBuildDate>
	<language>pl-PL</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	
	<item>
		<title>Zarządzanie datami w PHP z DateTime</title>
		<link>http://blog.visionsoftware.pl/programowanie-php/zarzadzanie-datami-w-php-z-datetime.html</link>
		<comments>http://blog.visionsoftware.pl/programowanie-php/zarzadzanie-datami-w-php-z-datetime.html#comments</comments>
		<pubDate>Tue, 31 May 2011 20:42:13 +0000</pubDate>
		<dc:creator><![CDATA[Marcin Fliszta]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[czas]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[DateTime]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[porównywanie dat]]></category>

		<guid isPermaLink="false">http://blog.visionsoftware.pl/?p=282</guid>
		<description><![CDATA[Gdy zamierzamy w PHP przeprowadzać operacje na datach i czasie, możemy skorzystać z wielu funkcji, takich jak date(), strtotime(), mktime() i innych. Znacznie łatwiej jednak wykonać potrzebne działania przy pomocy obiektu DateTime. który jest dostępny w PHP od wersji 5.3. W poniższym tekście postaram się przedstawić podstawowe możliwości tej przydatnej klasy. Stworzenie nowej daty przy pomocy DateTime jest niezwykle proste. Wystarczy podać odpowiednią wartość jako string tworząc nowy obiekt: Wynik wywołania powyższego kodu może być [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Gdy zamierzamy w PHP  przeprowadzać operacje na datach i czasie, możemy skorzystać z wielu funkcji, takich jak date(), strtotime(), mktime() i innych. Znacznie łatwiej jednak wykonać potrzebne działania przy pomocy obiektu DateTime. który jest dostępny w PHP od wersji 5.3. W poniższym tekście postaram się przedstawić podstawowe możliwości tej przydatnej klasy.<span id="more-282"></span></p>
<p>Stworzenie nowej daty przy pomocy DateTime jest niezwykle proste. Wystarczy podać odpowiednią wartość jako string tworząc nowy obiekt:</p>
<pre class="brush: php; title: ; notranslate">
$date_string = '2011-05-30';
$date = new DateTime($date_string);
echo $date-&gt;format('r');
</pre>
<p>Wynik wywołania powyższego kodu może być następujący:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
Mon, 30 May 2011 00:00:00 +0200 
</pre>
<p>Oczywiście możliwe jest także przekazywanie parametru także w innych formatach. W przypadku, gdy utworzymy obiekt z jego pominięciem, ustawiona zostanie bieżąca data i czas. Dzięki metodzie format() możemy w dowolny sposób wyświetlać przetwarzane daty.</p>
<h3>Operacje matematyczne na datach</h3>
<p>Obiekt DateTime może w znaczącym stopniu uprościć wszelkie działania na datach. Możemy w tym celu wykorzystać metodę modify(), dzięki której w prosty sposób dodamy lub odejmiemy od bazowego czasu podany okres. Na poniższym przykładzie pokazano w jaki sposób można tego dokonać:</p>
<pre class="brush: php; title: ; notranslate">
$date_string = '2011-05-30 20:33:44';
$date = new DateTime($date_string);
$date-&gt;modify('-3 days');
echo $date-&gt;format('Y-m-d H:i:s');
$date-&gt;modify('+2 month');
echo $date-&gt;format('Y-m-d H:i:s');
</pre>
<p>Wywołanie powyższego kodu powoduje odjęcie od początkowej daty 3 dni, a następnie dodanie do niej 2 miesięcy. Wynik powinien być więc następujący:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
2011-05-27 20:33:44
2011-07-27 20:33:44
</pre>
<p>Innym sposobem jest skorzystanie z metod add() oraz sub(), dzięki którym możemy dodawać oraz odejmować od bazowej daty określony czas. Parametr jest w tym przypadku podawany jako obiekt typu DateInterval. Możemy go utworzyć, stosując odpowiedni parametr przekazywany jako string w określonym formacie.  Poniższe wywołanie stworzy okres czasu wynoszący 5 lat, 6 miesięcy, 7 dni, 2 godziny, 3 minuty i 4 sekundy:</p>
<pre class="brush: php; title: ; notranslate">
$interval = new DateInterval('P5Y6M7DT2H3M4S');
</pre>
<p>Litery w parametrze oznaczają poszczególne części składowe daty i czasu:<br />
P – data: Y/M/D dla oznaczenia roku, miesiąca oraz dnia<br />
T – czas: H/M/S dla oznaczenia godzin, minut i sekund</p>
<p>Stosując tę możliwość, możemy dokonywać modyfikacji dat w następujący sposób:</p>
<pre class="brush: php; title: ; notranslate">
$date_string = '2011-05-30 20:33:44';
$date = new DateTime($date_string);
$date-&gt;add(new DateInterval('P2DT3H'));
echo $date-&gt;format('Y-m-d H:i:s');
$date-&gt;sub(new DateInterval('P2Y1M'));
echo $date-&gt;format('Y-m-d H:i:s');
</pre>
<p>W powyższym przykładzie do daty bazowej najpierw dodano 2 dni i 3 godziny, a następnie odjęto 2 lata i jeden miesiąc. Wynik wywołania wygląda następująco:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
2011-06-01 23:33:44
2009-05-01 23:33:44 
</pre>
<h3>Porównywanie dat</h3>
<p>Kolejnym ułatwieniem, jakie daje nam klasa DateTime, jest bardzo sprawne obliczanie różnic pomiędzy datami oraz ich porównywanie. Wystarczy w tym celu skorzystać z metody diff(). Na poniższym przykładzie przedstawiono sposób, w jaki można obliczyć, ile czasu pozostało do końca roku:</p>
<pre class="brush: php; title: ; notranslate">
$new_year = new DateTime('01-01-2012 00:00:00');
$now = new DateTime();
$diff = $new_year-&gt;diff($now);

echo &quot;Do końca roku pozostało {$diff-&gt;days} dni&quot;;
echo $diff-&gt;format(&quot;Do końca roku pozostało: %m miesięcy, %d dni, 
%h godzin, %i minut i %s sekund&quot;);
</pre>
<p>W wyniku wywołania kodu powinny się ukazać dwa teksty, w różny sposób przedstawiające czas:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
Do końca roku pozostało 215 dni
Do końca roku pozostało: 7 miesięcy, 1 dni, 1 godzin, 34 minut i 30 sekund 
</pre>
<p>Daty zdefiniowane przy pomocy obiektu DateTime możemy także porównywać przy pomocy zwykłej instrukcji if. Zostało to przedstawione na poniższym kodzie:</p>
<pre class="brush: php; title: ; notranslate">
$date1 = new DateTime('2011-01-01');
$date2 = new DateTime('2012-01-01');

if($date1&gt;$date2){
	echo &quot;Pierwsza data jest większa&quot;;
}
elseif($date1&lt;$date2){
	echo &quot;Druga data jest większa&quot;;
}
else{
	echo &quot;Daty są takie same&quot;;
}
</pre>
<h3>Strefy czasowe</h3>
<p>Tworząc obiekt DateTime, możemy określić strefę czasową dla jakiej go definiujemy. W przypadku, gdy tego nie określimy, zostanie przyporządkowany do zdefiniowanej w konfiguracji systemu.</p>
<p>Listę dostępnych stref czasowych możemy sprawdzić, korzystając z dostępnej metody:</p>
<pre class="brush: php; title: ; notranslate">
print_r(DateTimeZone::listIdentifiers()); 
</pre>
<p>Aby zdefiniować datę dla określonej strefy czasowej, wystarczy dodać do wywołania odpowiedni parametr:</p>
<pre class="brush: php; light: true; title: ; notranslate">
$date = new DateTime('2011-05-30 18:11:22', new DateTimeZone('America/New_York'));
</pre>
<p>W celu przeliczenia, jaki czas będzie o tej porze w Polsce, wystarczy skorzystać z poniższego wywołania:</p>
<pre class="brush: php; title: ; notranslate">
$date-&gt;setTimeZone(new DateTimeZone('Europe/Warsaw'));
echo $date-&gt;format('Y-m-d H:i:s');
</pre>
<p>Wywołanie powinno zwrócić następny rezultat:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
2011-05-31 00:11:22
</pre>
<h3>Podsumowanie</h3>
<p>Jak przedstawiono na powyższych przykładach, dzięki obiektowi DateTime możemy zaoszczędzić wiele czasu i linijek kodu. Zachęcam do dokładnego zapoznania się ze <a href="http://pl.php.net/manual/en/book.datetime.php" target="_blank" title="Dokumentacja PHP: DateTime">szczegółową dokumentacją</a> przedstawionych klas, gdyż pokazane tu zagadnienia obejmują jedynie ich podstawowe możliwości.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.visionsoftware.pl/programowanie-php/zarzadzanie-datami-w-php-z-datetime.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
