Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: 3p0 в Aug 29, 2016, 11:18



Титла: Датите в PHP ми правят проблем
Публикувано от: 3p0 в Aug 29, 2016, 11:18
Опитвам се да правя изчисление на период между бъдеща дата и днешна дата, (по-скоро дата, час, минута, секунда),
обаче получавам събщение за неправилно подаден параметър:
Код:
<?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

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


Титла: Re: Датите в PHP ми правят проблем
Публикувано от: go_fire в Aug 29, 2016, 11:49
Еха-а ти си пишеш по старият начин — всичко накуп. Така лесно се стига до грешка, като твоята. Мързи ме да ти чета старателно кода, но п4п е много приятелски настроен и ти се казва точно каква е грешката. Между другото го правиш грешно. Това е много по-добре не да се прави директно с дати, а с числови низове по времето на Юникс, едно от най-хубавите неща в тая ОС.


Титла: Re: Датите в PHP ми правят проблем
Публикувано от: Naka в Aug 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-а и обратно.


Титла: Re: Датите в PHP ми правят проблем
Публикувано от: 3p0 в Aug 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м.


Титла: Re: Датите в PHP ми правят проблем
Публикувано от: Zorkata в Aug 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)? Според мен това има своите преимущества и има глад за такива специалисти.


Титла: Re: Датите в PHP ми правят проблем
Публикувано от: 3p0 в Aug 29, 2016, 16:32
@Zorkata,
Наистина е по-елегантно твоето решениe, само при мен "\n" не прави нов ред, затова изпoлзвах <br> .


Титла: Re: Датите в PHP ми правят проблем
Публикувано от: NorthBridge в Aug 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 библиотеката ($2).

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


Титла: Re: Датите в PHP ми правят проблем
Публикувано от: 3p0 в Aug 29, 2016, 19:10
Здрасти @NorthBridge  [_]3

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


Титла: Re: Датите в PHP ми правят проблем
Публикувано от: 3p0 в Aug 30, 2016, 12:43
Като не става всичко с PHP, ще опитам с JS :D