Okres premium (czas unix na minusie)

0
<?php
   //Premium time
   try{
      $pdo = new PDO('mysql:host=localhost;dbname=time', 'root', '');
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      
      $stmt = $pdo -> query('SELECT `premium_time`, `premium_end`, `days` FROM `premium`');
      echo '<ul>';
      while($row = $stmt->fetch()){
         $actual_date = date('Y-m-d H:i:s');
         $remained = (strtotime($row['premium_time']) - strtotime($row['premium_end'])) / (60*60*24);

         if($actual_date >= $row['premium_end']){
           echo '<li>Koniec okresu premium!</li>';
         }else{
           echo '<li>Pozostało '.$remained.' dni do końca okresu premium!</li>';
         }
      }
      $stmt->closeCursor();
      echo '</ul>';
   }
   catch(PDOException $e){
      echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
   }
?>

Zwraca mi to:

Pozostało -30.971527777778 dni do końca okresu premium!

Dlaczego czas jest na minusie oraz jak pozbyć się zaogrąglenia? Jak w ogóle wyśietlić konkretną datę do końca okresu premium w formacie (Y-m-d H:i:s)? Podczas dodawania konta pobieram aktualną datę i zapisuję ją do kolumny premium_time oraz wykonuję opercję dodania + 30 dni do tej daty i ów datę zapisuję do kolumny premium_end. Teraz nie bardzo wiem jak pobrać czas do końca okresu premium. Jak to zrobić?

0

W

$remained

odejmujesz od daty włączenia premium datę końca premium hmmmm...
Spróbuj z aktualną datą i datą zakończenia premium ;)

0

Ok, racja. Poprawiłem. Minus zniknął ale teraz pytanie co zrobić, żeby wyświetlał się prawidłowy format daty bez tych liczb po przecinku?

Kod:

<?php
   //Premium time
   try{
      $pdo = new PDO('mysql:host=localhost;dbname=time', 'root', '');
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      
      $stmt = $pdo -> query('SELECT `premium_time`, `premium_end`, `days` FROM `premium`');
      echo '<ul>';
      while($row = $stmt->fetch()){
         //$actual_day = date('d');
         $actual_day = date('Y-m-d H:i:s');
         $actual_minutes = date('Y-m-d H:i:s');
         $remained = (strtotime($row['premium_end']) - strtotime($actual_day)) / (86400);
         $minutes = (strtotime($row['premium_end']) - strtotime($actual_minutes)) / (60);
         if($actual_day >= $row['premium_end']){
           echo '<li>Koniec okresu premium!</li>';
         }else{
           echo '<li>Pozostało '.$remained.' dni, '.$minutes.' minut do końca okresu premium!</li>';
         }
      }
      $stmt->closeCursor();
      echo '</ul>';
   }
   catch(PDOException $e){
      echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
   }
?>

Pozostało 0.85101851851852 dni, 1225.4666666667 minut do końca okresu premium!

0

W jakim formacie w bazie trzymasz premium_end? Jeśli jako znacznik czasu to poniżej możesz wyrzucić funkcje strtotime

$actual_day = time();
$actual_minutes = time();
$remained = (strtotime($row['premium_end']) - $actual_day) / (86400);
$minutes = (strtotime($row['premium_end']) - $actual_minutes) / (60);
0

Podane przez Ciebie rozwiązanie zwracaw minuty jako: -772.05 minut
Ogólnie casz w bazie danych mam zapisany w formacie RRRR-MM-DD GG:MM:SS
Aktualny kod:

<?php
   //Premium time
   try{
      $pdo = new PDO('mysql:host=localhost;dbname=time', 'root', '');
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      
      $stmt = $pdo -> query('SELECT `premium_time`, `premium_end`, `days` FROM `premium`');
      echo '<ul>';
      while($row = $stmt->fetch()){
         $actual_day = date('d');
         $actual_houers = date('H');
         $actual_minutes = date('i');
         $actual_seconds = date('s');
         $days = (date('d', strtotime($row['premium_end'])) - $actual_day); 
         $houers = (date('H', strtotime($row['premium_end'])) - $actual_houers); 
         $minutes = (date('i', strtotime($row['premium_end'])) - $actual_minutes); 
         $seconds = (date('s', strtotime($row['premium_end'])) - $actual_seconds); 
         if($actual_day >= $row['premium_end']){
           echo '<li>Koniec okresu premium!</li>';
         }else{ echo '
            <li>Pozostało <strong>'.$days.'</strong> dni,
            <strong>'.$houers.' godzin, </strong> 
            <strong>'.$minutes.' minut, </strong>
            <strong>'.$seconds.' sekund, </strong>
            do końca okresu premium!</li>';
         }
      }
      $stmt->closeCursor();
      echo '</ul>';
   }
   catch(PDOException $e){
      echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
   }
?>

Zwraca mi to:
Pozostało 0 dni, -12 godzin, -54 minut, -27 sekund, do końca okresu premium!
mimo, że do końca pozostał tydzień(15.08). Ma ktoś pomysł jak to naprawić?

0

Bierzesz z bazy datę w formacie date, zamieniasz to na znacznik czasu i odejmujesz aktualną datę w formacie date
Zdecyduj się.

Sprawdź, powinno działać ale specem nie jestem ;)

<?php
   //Premium time
   try{
      $pdo = new PDO('mysql:host=localhost;dbname=time', 'root', '');
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
      $stmt = $pdo -> query('SELECT `premium_time`, `premium_end`, `days` FROM `premium`');
      echo '<ul>';
      while($row = $stmt->fetch()){
         $today = time();
         $days = (strtotime($row['premium_end']) - $today) /(60*60*24); 
         $hours = (strtotime($row['premium_end']) - $today) /(60*60); 
         $minutes = (strtotime($row['premium_end']) - $today) /60; 
         $seconds = strtotime($row['premium_end']) - $today; 
         if($actual_day >= $row['premium_end']){
           echo '<li>Koniec okresu premium!</li>';
         }else{ echo '
            <li>Pozostało <strong>'.$days.'</strong> dni,
            <strong>'.$hours.' godzin, </strong> 
            <strong>'.$minutes.' minut, </strong>
            <strong>'.$seconds.' sekund, </strong>
            do końca okresu premium!</li>';
         }
      }
      $stmt->closeCursor();
      echo '</ul>';
   }
   catch(PDOException $e){
      echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
   }
?>
0

To zwraca Twój kod:

Pozostało -0.59952546296296 dni, -14.388611111111 godzin, -863.31666666667 minut, -51799 sekund, do końca okresu premium!

To jest ten problem, że nie bardzo wiem jak to pozamieniać.

1

Polecam zainteresować się klasą DateTime.
Przykład, jak prosto i czytelnie obliczyć różnicę między dwiema datami i wyświetlić w wybranym formacie (po więcej odsyłam do: http://php.net/manual/en/class.datetime.php)

$date1 = new DateTime("2016-08-10");
$date2 = new DateTime();

$interval = $date2->diff($date1);
echo $interval->format('%D:%H:%I:%S');
0

Jedyne sensowne rozwiązanie to wykorzystanie klasy DateTime, tak jak pisze @Tumeg.
Oprócz tego powinieneś zwracać uwagę na wykorzystywane słownictwo: actual oznacza prawdziwy, podczas gdy current - aktualny.

Dlaczego czas jest na minusie (...)
Nie wystarczyłoby jedynie zamienić odjemną i odjemnik miejscami?

(...) oraz jak pozbyć się zaogrąglenia
Jakiego zaokrąglenia? Wszystkie liczby masz zmiennoprzecinkowe w pełnej okazałości.

Jak w ogóle wyśietlić konkretną datę do końca okresu premium w formacie (Y-m-d H:i:s)?
Klasa DateTime + http://php.net/manual/pl/datetime.add.php

0

Dzięki. Klasa DateTime() działa w jak trzeba. Skrypt w 100% jest taki jak bym chciał.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.