Автор Тема: Датите в PHP ми правят проблем  (Прочетена 2458 пъти)

3p0

  • Участник
  • *****
  • Публикации: 338
    • Профил
Опитвам се да правя изчисление на период между бъдеща дата и днешна дата, (по-скоро дата, час, минута, секунда),
обаче получавам събщение за неправилно подаден параметър:
Код:
<?php
  $dt_format = 'Y-M-d H:i:s';
  date_default_timezone_set("Europe/Sofia");
  $to_date = date("Y-m-d H:i:s");
  $date1 = new DateTime('2016-09-01 14:00:00');
  $date2 = new DateTime('2016-09-01 14:15:00');
  $diff1 = $to_date->diff($date1);  /* грешка */
  print($diff1 . $new_row);
  $diff2 = $to_date->diff($date2);
  print($diff2 . $new_row);
?>
Получавам грешка:
Fatal error: Call to a member function diff() on string in index.php

Тогава добавям един ред за конвертиране от стринг в дата:
Код:
<?php
  $dt_format = 'Y-M-d H:i:s';
  date_default_timezone_set("Europe/Sofia");
  $to_date = date("Y-m-d H:i:s");
  $date1 = new DateTime('2016-09-01 14:00:00');
  $date2 = new DateTime('2016-09-01 14:15:00');
  $to_date = DateTime::createFromFormat($dt_format, $to_date);
  $diff1 = $to_date->diff($date1);  /* грешка */
  print($diff1 . $new_row);
  $diff2 = $to_date->diff($date2);
  print($diff2 . $new_row);
?>
Тогава получавам съобщение за грешка:
Fatal error: Call to a member function diff() on boolean in index.php

И закъсах тотално  ???
« Последна редакция: Авг 29, 2016, 12:32 от 3p0 »
Активен

PC1: Intel® Celeron® CPU G540 2.50GHz; MB=Gigabyte GA-H81M-S2H rev.1.0; RAM=16Гб DDR3; VIDEO=SAPPHIRE ATI RADEON 4850.
PC2: AMD Athlon (tm) 64 X2 Dual Core Processor 5400+ 2.80 GHz; MB=GIGABYTE M61PME-S2P; RAM=8Гб DDR2; Video=NVIDIA nForce 6150SE (6100-430) - built in the MB.

go_fire

  • Участник
  • *****
  • Публикации: 5102
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Re: Датите в PHP ми правят проблем
« Отговор #1 -: Авг 29, 2016, 11:49 »
Еха-а ти си пишеш по старият начин — всичко накуп. Така лесно се стига до грешка, като твоята. Мързи ме да ти чета старателно кода, но п4п е много приятелски настроен и ти се казва точно каква е грешката. Между другото го правиш грешно. Това е много по-добре не да се прави директно с дати, а с числови низове по времето на Юникс, едно от най-хубавите неща в тая ОС.
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

Naka

  • Участник
  • *****
  • Публикации: 2618
    • Профил
Re: Датите в PHP ми правят проблем
« Отговор #2 -: Авг 29, 2016, 14:13 »
Ако искаш да сравняваш дати(със време или без) най лесният начин е да работиш със Unix timestamp.

Това е обикновенно число - броят секунди от началото на January 1 1970 00:00:00
и тогава просто изваждаш две числа. И ще получиш разликата в секунди между двете дати.

print time();
strtotime("+1 day");

print strtotime("+1 day")- time();


86400 sec = 24 * 60 * 60


има си функции за преобразуване от стрингова дата към  timestamp-а и обратно.
« Последна редакция: Авг 29, 2016, 14:31 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

3p0

  • Участник
  • *****
  • Публикации: 338
    • Профил
Re: Датите в PHP ми правят проблем
« Отговор #3 -: Авг 29, 2016, 15:09 »
Полудях, обаче стана:
Код:
<?php
  $new_row = "<br>";
  $dt_format = 'Y-m-d H:i';
  date_default_timezone_set("Europe/Sofia");
  $dt_now = date($dt_format);
  print("Днес е " . $dt_now . $new_row);
  $date1 = new DateTime('2016-09-01 14:00:00');
  $date2 = new DateTime('2016-09-01 14:15:00');
  $dt_now = DateTime::createFromFormat($dt_format, $dt_now);
  $diff1 = $dt_now->diff($date1);
  print ($diff1->y . "г. " . $diff1->m . "м. " . $diff1->d . "д. " . $diff1->h . "ч. " . $diff1->i . "м. " . $new_row);
  $diff2 = $dt_now->diff($date2);
  print ($diff2->y . "г. " . $diff2->m . "м. " . $diff2->d . "д. " . $diff2->h . "ч. " . $diff2->i . "м. " . $new_row);
?>

Дава резултат:
Днес е 2016-08-29 15:08
0г. 0м. 2д. 22ч. 52м.
0г. 0м. 2д. 23ч. 7м.
Активен

PC1: Intel® Celeron® CPU G540 2.50GHz; MB=Gigabyte GA-H81M-S2H rev.1.0; RAM=16Гб DDR3; VIDEO=SAPPHIRE ATI RADEON 4850.
PC2: AMD Athlon (tm) 64 X2 Dual Core Processor 5400+ 2.80 GHz; MB=GIGABYTE M61PME-S2P; RAM=8Гб DDR2; Video=NVIDIA nForce 6150SE (6100-430) - built in the MB.

Zorkata

  • Участник
  • *****
  • Публикации: 5
    • Профил
Re: Датите в PHP ми правят проблем
« Отговор #4 -: Авг 29, 2016, 16:14 »
Ето едно решение, което е малко по-различно и лично спред мен по-елегантно:

Код:
<?php

$dt_format = 'Y-m-d H:i';
$new_row = "\n";

$dt_now = new DateTime();
$date1 = DateTime::createFromFormat($dt_format, '2016-09-01 14:00');
$date2 = DateTime::createFromFormat($dt_format, '2016-09-01 14:15');

print("Днес е " . $dt_now->format($dt_format) . $new_row);

$diff1 = $dt_now->diff($date1);
print ($diff1->format('%y г. %m м. %d д. %h ч. %i м.') . $new_row);

$diff2 = $dt_now->diff($date2);
print ($diff2->format('%y г. %m м. %d д. %h ч. %i м.') . $new_row);

Между другото, ако искаш да научиш нещо ново, защо не се хванеш да научиш MEAN (MongoDB, ExpressJS, AngularJS, NodeJS)? Според мен това има своите преимущества и има глад за такива специалисти.
Активен

3p0

  • Участник
  • *****
  • Публикации: 338
    • Профил
Re: Датите в PHP ми правят проблем
« Отговор #5 -: Авг 29, 2016, 16:32 »
@Zorkata,
Наистина е по-елегантно твоето решениe, само при мен "\n" не прави нов ред, затова изпoлзвах <br> .
Активен

PC1: Intel® Celeron® CPU G540 2.50GHz; MB=Gigabyte GA-H81M-S2H rev.1.0; RAM=16Гб DDR3; VIDEO=SAPPHIRE ATI RADEON 4850.
PC2: AMD Athlon (tm) 64 X2 Dual Core Processor 5400+ 2.80 GHz; MB=GIGABYTE M61PME-S2P; RAM=8Гб DDR2; Video=NVIDIA nForce 6150SE (6100-430) - built in the MB.

NorthBridge

  • Участник
  • *****
  • Публикации: 177
  • Distribution: Slackware-current
  • Window Manager: Enlightenment E17
  • Mad Tinkerer
    • Профил
Re: Датите в PHP ми правят проблем
« Отговор #6 -: Авг 29, 2016, 17:59 »
Опитвам се да правя изчисление на период между бъдеща дата и днешна дата, (по-скоро дата, час, минута, секунда),
обаче получавам събщение за неправилно подаден параметър:
Код:
<?php
  $dt_format = 'Y-M-d H:i:s';
  date_default_timezone_set("Europe/Sofia");
  $to_date = date("Y-m-d H:i:s");
  $date1 = new DateTime('2016-09-01 14:00:00');
  $date2 = new DateTime('2016-09-01 14:15:00');
  $diff1 = $to_date->diff($date1);  /* грешка */
  print($diff1 . $new_row);
  $diff2 = $to_date->diff($date2);
  print($diff2 . $new_row);
?>
Получавам грешка:
Fatal error: Call to a member function diff() on string in index.php

Тогава добавям един ред за конвертиране от стринг в дата:
Код:
<?php
  $dt_format = 'Y-M-d H:i:s';
  date_default_timezone_set("Europe/Sofia");
  $to_date = date("Y-m-d H:i:s");
  $date1 = new DateTime('2016-09-01 14:00:00');
  $date2 = new DateTime('2016-09-01 14:15:00');
  $to_date = DateTime::createFromFormat($dt_format, $to_date);
  $diff1 = $to_date->diff($date1);  /* грешка */
  print($diff1 . $new_row);
  $diff2 = $to_date->diff($date2);
  print($diff2 . $new_row);
?>
Тогава получавам съобщение за грешка:
Fatal error: Call to a member function diff() on boolean in index.php

И закъсах тотално  ???

Здрасти колега  [_]3

В първия ти пример гърми защото date() връща...стринг, а не DateTime обект, съответно ти се опитваш да извикаш метод на стринг, което няма как да стане.
Във втория ти пример имаш разминаване между двата формата - на едното място е 'Y-m-d H:i:s', а на другото 'Y-M-d H:i:s' (голямо и малко М във формата ще имат различни резултати, затова гърми). Ако ги направиш еднакви на двете места, примера работи.

Предполагам че драскаш някакво скриптче, но ако ще го ползваш в проект, не се мъчи с default-ния DateTime, а ползвай Carbon библиотеката.

Между другото, ако искаш да научиш нещо ново, защо не се хванеш да научиш MEAN (MongoDB, ExpressJS, AngularJS, NodeJS)? Според мен това има своите преимущества и има глад за такива специалисти.
Той може и Java ЕЕ да научи ако му се учи нещо ново, там също има глад за специалисти  [_]3
Активен

I did a 'zcat vmlinuz > /dev/audio' and I think I heard God...

3p0

  • Участник
  • *****
  • Публикации: 338
    • Профил
Re: Датите в PHP ми правят проблем
« Отговор #7 -: Авг 29, 2016, 19:10 »
Здрасти @NorthBridge  [_]3

За първия пример, се досетих, че е заради стринговото съдържание на променливата ....
За втория пример, помислих, че PHP е много капризен, защото забелязах, че имам променлива за формата, а използвам директно описание, но не забелязах, че са различни и като сложих променливата на мястото на директното описание, спря да дава съобщението за грешка :)
Самообучавам се, като си поставям сам задачи, примерно на 1.септември имам да ходя на две места и ако успея да ме подсети този пример, като включи някой виде-клип от интернет в точно определеното до минута време, значи няма да забравя, да отида на тези две места - имам 2 дни да го постигна.  :)
Докато търсех в интернет срещнах Carbon, но не се задълбочих ....
Активен

PC1: Intel® Celeron® CPU G540 2.50GHz; MB=Gigabyte GA-H81M-S2H rev.1.0; RAM=16Гб DDR3; VIDEO=SAPPHIRE ATI RADEON 4850.
PC2: AMD Athlon (tm) 64 X2 Dual Core Processor 5400+ 2.80 GHz; MB=GIGABYTE M61PME-S2P; RAM=8Гб DDR2; Video=NVIDIA nForce 6150SE (6100-430) - built in the MB.

3p0

  • Участник
  • *****
  • Публикации: 338
    • Профил
Re: Датите в PHP ми правят проблем
« Отговор #8 -: Авг 30, 2016, 12:43 »
Като не става всичко с PHP, ще опитам с JS :D
Активен

PC1: Intel® Celeron® CPU G540 2.50GHz; MB=Gigabyte GA-H81M-S2H rev.1.0; RAM=16Гб DDR3; VIDEO=SAPPHIRE ATI RADEON 4850.
PC2: AMD Athlon (tm) 64 X2 Dual Core Processor 5400+ 2.80 GHz; MB=GIGABYTE M61PME-S2P; RAM=8Гб DDR2; Video=NVIDIA nForce 6150SE (6100-430) - built in the MB.