На колко години месеци и дни си

C++ JAVA
User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3359
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 128

На колко години месеци и дни си

Post by dakata__92 » Thu Mar 19, 2015 11:25 am

Нещо забих тотално. Търся си прост код с който да калкулирам някой на колко години е с точност месеци и дни. Примерно имам датата
2015 03 19 - 1993 02 17 = 22 01 02.
Искам да е възможно най-сбито и упростено но се сещам само за някакви така по-обемни функции а не са ми нужни. Не се сещам как точно да го направя в момента. :)

Fakeheal
Гуру
Гуру
Posts: 2718
Joined: Sat Apr 17, 2010 6:37 am
Answers: 351
Location: /r/eyebleach
Contact:

Post by Fakeheal » Thu Mar 19, 2015 11:30 am

Използвай DateTime класа и diff метода на php:

Code: Select all

$date = new DateTime('1995-03-13'); //или 13-03-1995
$now = new DateTime();
$interval = $now->diff($date);
echo $interval->y;
http://php.net/manual/en/datetime.diff.php

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3359
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 128

Post by dakata__92 » Thu Mar 19, 2015 11:46 am

Fakeheal wrote:Използвай DateTime класа и diff метода на php:

Code: Select all

$date = new DateTime('1995-03-13'); //или 13-03-1995
$now = new DateTime();
$interval = $now->diff($date);
echo $interval->y;
http://php.net/manual/en/datetime.diff.php
Няма ли друг варянт? Не ми се правят две напразни инстанции на класове само заради гъзарийката ми. Принципно става и е правилен варянта ти за което благодаря но процедурен код търся.

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3359
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 128

Post by dakata__92 » Thu Mar 19, 2015 11:59 am

Справих се. Ако може да го скъсим някак ще съм благодарен.
[php]
$ageY = date("Y")-intval($yyyy);
$ageM = date("n")-intval($mm);
$ageD = date("j")-intval($dd);
if($ageD < 0){
$ageD = $ageD += date("t");
$ageM--;
}
if($ageM < 0){
$ageM+=12;
$ageY--;
}
$age = $ageY."/".$ageM."/".$ageD;
[/php] :)

lamerko
Турист
Турист
Posts: 267
Joined: Sat Dec 16, 2006 4:14 pm
Answers: 15

Post by lamerko » Thu Mar 19, 2015 12:03 pm

Защо да правим нещо както трябва, щом можем да нацвъкаме някаква глупост :)

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3359
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 128

Post by dakata__92 » Thu Mar 19, 2015 12:11 pm

lamerko wrote:Защо да правим нещо както трябва, щом можем да нацвъкаме някаква глупост :)
Защото ако гониш производителност ще разбереш колко забавят инстанциите и зареждането в паметта при голям брой интерации в цикъл. Защотото ако имам 5000 интерации на цикъла горният код е по-бърз от създаването на две ненужни инстанции. Не е въпроса в писането на кода знам, че нейният варянт е правилен и то много повече спрямо моят но все пак е по-бавен заради зареждането на ненужни методи в паметта.

Fakeheal
Гуру
Гуру
Posts: 2718
Joined: Sat Apr 17, 2010 6:37 am
Answers: 351
Location: /r/eyebleach
Contact:

Post by Fakeheal » Thu Mar 19, 2015 3:34 pm

dakata__92 wrote:
lamerko wrote:Защо да правим нещо както трябва, щом можем да нацвъкаме някаква глупост :)
Защото ако гониш производителност ще разбереш колко забавят инстанциите и зареждането в паметта при голям брой интерации в цикъл. Защотото ако имам 5000 интерации на цикъла горният код е по-бърз от създаването на две ненужни инстанции. Не е въпроса в писането на кода знам, че нейният варянт е правилен и то много повече спрямо моят но все пак е по-бавен заради зареждането на ненужни методи в паметта.
Искаш да кажеш, че всеки голям проект (те очевидно гонят производителност, иначе не им е на далаверка), не използват обекти и като цяло нямат взимане-даване с ООП, за да са бързи?

Относно примера ти:
"Защотото ако имам 5000 интерации на цикъла горният код е по-бърз от създаването на две ненужни инстанции."
Вкарай малко логика. Защо 5000 пъти ще създаваш new DateTime(); (за сегашната дата)? Смяташ години, не часове, не секунди. Цикъла ти и половин ден да върви (poor you), надали ще изкара нещо невярно.

Обектите не са нещо, което е измислено да ти твари кода и да ти се мотка само пред очите. ООП е нещо супер мощно, логично и добронамерено. :P

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3359
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 128

Post by dakata__92 » Thu Mar 19, 2015 3:56 pm

Нямам нищо против ООП. Кодът ми е обектно ориентиран просто в метода който съм създал искам да използвам процедурен код. С microtime виждам за какво време се зареждат нещата. Когато ползвам в логиката твоят код дори теста да е както казваш ти "Защо 5000 пъти ще създаваш new DateTime(); (за сегашната дата)? "пак се бави повече спрямо процедурното решение което съм задал. Извинявам се но ако търся производителност в точно определен метод съставляващ 75 - 80 процента от приложението на обектноориентиран код който бива викан от незнайно къде да обработва и изчислява количество информация на база даден ключ в моят случай това грубо решение което подадох е по-бързо спрямо интерационната промяна на датата и зареждането в паметта на още допълнителни методи при инициализацията. Тоест просто казано пълня паметта с http://bg2.php.net/manual/en/class.datetime.php ето тази ненужна логика когато ми трябват прости процедурни решения. Няма защо да влизаме в дълбочина аз съм привърженик на ООП! Просто случаят ми е такъв и търся процедурно решение на проблема. :) Ако е възможно горният код да бъде подобрен ще съм много благодарен и опростен. :) :?:

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3359
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 128

Post by dakata__92 » Thu Mar 19, 2015 4:14 pm

Просто сравни времената при 5000 интерации без голяма логика и се увери сама. Като цяло разликата е никаква но в приложението се усеща веднага.
[php]
<meta http-equiv='Content-Type' content='text/html; charset= utf-8' />
<?php
$time_start = microtime(true);
for($i=0;$i<5000;$i++){
$ageY = date("Y")-1993;
$ageM = date("n")-11;
$ageD = date("j")-17;
if($ageD < 0){
$ageD = $ageD += date("t");
$ageM--;
}
if($ageM < 0){
$ageM+=12;
$ageY--;
}
$age = $ageY."/".$ageM."/".$ageD;

}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "<br><center>Време ".$time."</center>";
?>
[/php]
сравни го с
[php]
<meta http-equiv='Content-Type' content='text/html; charset= utf-8' />
<?php
$time_start = microtime(true);
$date = new DateTime('1993-11-17');
for($i=0;$i<5000;$i++){
$now = new DateTime();
$interval = $now->diff($date);
$age = $interval->y.$interval->m.$interval->d;
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "<br><center>Време ".$time."</center>";
?>
[/php]

User avatar
alex95_bg_2
Шаман
Шаман
Posts: 5462
Joined: Thu Jul 24, 2008 8:25 am
Answers: 325
Location: localhost
Contact:

Post by alex95_bg_2 » Thu Mar 19, 2015 5:28 pm

Твърдението ти много ме заинтригува и реших да пробвам кода, който си дал. Направих няколко промени:

Code: Select all

$date = new DateTime&#40;'1993-11-17'&#41;;
for&#40;$i=0;$i<5000;$i++&#41;&#123;
	$now = new DateTime&#40;&#41;;
1.Предполагам че си разменил местата на $now и $date - няма смисъл да правиш now винаги (но дори и да не е така разлика няма - опитах)

2. 5000 е изключително малко за подобен тест, така не проверяваш скоростта на твоя код а на php, кешове, оптимизации и т.н. Направих го 50000

Код: http://pastebin.com/M6SbgP5E
Резултати с Xeon E3-1241 и PHP 5.3.10 (много стара версия!) без опкод кеш.

Code: Select all

time classes&#58; 0.39952707290649
time functions&#58; 0.50110602378845
time classes no gc&#58; 0.38848996162415
Никога не трябва да спираш gc в истински код, направих го от интерес - разликата е почти никаква. За около 20 рефреш-а разликата е минимална.

Опит с 500 000 итерации:

Code: Select all

time classes&#58; 3.8634009361267
time functions&#58; 5.0189640522003
time classes no gc&#58; 3.9263830184937
Разликата е никаква, но я има и е в полза на обектното решение при мен.
Лично аз никога не бих избрал процедурно мазало в сравнение с 2 реда код, който дори и работи по-бързо.
Отново, това няма никакъв начин да се усети, за разлика от много други неща в кода ти със сигурност. Ако трафика ти е толкова огромен че разлика от няколко наносекунди е проблем мисля че php е грешният инструмент за целта.

Post Reply