Avatar billede gulvlugt Nybegynder
19. maj 2008 - 23:23 Der er 17 kommentarer og
1 løsning

Datetime - regn ud hvor lang tid af din lejeperiode du har..

Hej.

I min tabel har jeg et felt ved navn time, og dens "format" er datetime;
time datetime NOT NULL,

Så er det på plads. Med min PHP-kode:
mysql_query("INSERT INTO ... (time) values (NOW())") or die(mysql_error());

... gemmer den. Det kommer så til at se sådan her ud:
2008-05-06 14:24:01

Den her blev oprettet d. 06-05-2008 klokken 14.24.01.

Hvordan kan jeg få den til at hive det her ud af databasen, og så samligne med hvad d.d er, og så udskrive hvor mange dage, timer, minutter og sekunder der er tilbage.
Avatar billede asn24 Nybegynder
20. maj 2008 - 00:52 #1
Jeg ville lave en explode funktion til at få dato og klokkeslet delt. Derefter ville jeg sammenligne datoerne, for at få dage. Derefter ville jeg sammenligne selve tidspunktet.

Noget i stil med:

$split_time = explode(" ", $date_time);

Herefter ville jeg endnu en gang lave en explode, så jeg får år, måned og dag hver for sig, for så at sammenligne det med det nuværende tidspunkt.

Derefter ville jeg gøre det samme med tidspunkt :)

Håber det hjalp lidt :)
Avatar billede coderdk Praktikant
20. maj 2008 - 03:31 #2
MySQL over v4.11 har DATEDIFF: http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_datediff
Det er så kun antal dage du får - Men en $diff_i_sekunder = ( strtotime( $row['ditfelt'] ) - time() ); giver dig differencen i sekunder ;)
Avatar billede danishmale Nybegynder
20. maj 2008 - 04:32 #3
<?php
  function rest_datetime($currentdatetime='0000-00-00 00:00:00',$enddatetime='0000-00-00 00:00:00')
  {
      // Splitter aktuel datetime i dato og tid enhed
      $current_datetime = explode(' ',$currentdatetime);
      // Splitter aktuel  dato
      $current_date = explode('-',$current_datetime[0]);
      // Splitter aktuel tid
      $current_time = explode(':',$current_datetime[1]);
      // Splitter slut datetime i dato og tid enhed
      $end_datetime = explode(' ',$enddatetime);
      // Splitter slut  dato
      $end_date = explode('-',$end_datetime[0]);
      // Splitter slut tid
      $end_time = explode(':',$end_datetime[1]);
      // Beregner total tidsdifference
      $time_dif = mktime($end_time[0],$end_time[1],$end_time[2],$end_date[1],$end_date[2],$end_date[0])- mktime($current_time[0],$current_time[1],$current_time[2],$current_date[1],$current_date[2],$current_date[0]);
      // Bregner dagsforskel
      $days = floor($time_dif / 86400);
      // Trækker dage fra total tidsforskel
      $time_dif = $time_dif - ($days*86400);
      // Bregner timeforskel
      $hours = floor($time_dif / 3600);
      // Trækker timer fra total tidsforskel
      $time_dif = $time_dif - ($hours*3600);
      // Bregner minutforskel
      $minutes = ($time_dif /60);
      // Bregner sekundforskel
      $seconds = $time_dif - ($minutes*60);
      // Sender resultat tilbage
      return $days."dag(e), ".$hours."time(r), ".$minutes."minut(ter), ".$seconds."sekund(er)";
  }

// Test datetimes
$start_test = '2008-12-30 22:50:00';
$slut_test = '2008-12-31 23:55:00';
  // Udskriver og kalder function
  echo rest_datetime($start_test,$slut_test);
?>
Avatar billede danishmale Nybegynder
20. maj 2008 - 04:33 #4
Hov.....


$minutes = ($time_dif /60); 

skal være:

$minutes = floor($time_dif /60);
Avatar billede coderdk Praktikant
20. maj 2008 - 09:09 #5
Alt dette:

      // Splitter aktuel datetime i dato og tid enhed
      $current_datetime = explode(' ',$currentdatetime);
      // Splitter aktuel  dato
      $current_date = explode('-',$current_datetime[0]);
      // Splitter aktuel tid
      $current_time = explode(':',$current_datetime[1]);
      // Splitter slut datetime i dato og tid enhed
      $end_datetime = explode(' ',$enddatetime);
      // Splitter slut  dato
      $end_date = explode('-',$end_datetime[0]);
      // Splitter slut tid
      $end_time = explode(':',$end_datetime[1]);
      // Beregner total tidsdifference
      $time_dif = mktime($end_time[0],$end_time[1],$end_time[2],$end_date[1],$end_date[2],$end_date[0])- mktime($current_time[0],$current_time[1],$current_time[2],$current_date[1],$current_date[2],$current_date[0]);


kan erstattes med:

  $time_diff = strtotime( $enddatetime ) - strtotime( $currentdatetime );
Avatar billede gulvlugt Nybegynder
20. maj 2008 - 15:15 #6
Coderdk - Koden er fin nok. Mend en udskriver:

14 dag(e), 0 time(r), 60 minut(ter).

Kan det fikses?
Avatar billede asn24 Nybegynder
20. maj 2008 - 15:22 #7
if ($days <> 1) {
  $day_text = "dage";
} else {
  $day_text = "dag";
}

if ($hours <> 1) {
  $hour_text = "timer";
} else {
  $hour_text = "time";
}

if ($minutes <> 1) {
  $minute_text = "minutter";
} else {
  $minute_text = "minut";
}

if ($seconds <> 1) {
  $second_text = "sekunder";
} else {
  $second_text = "sekund";
}
return $days . $day_text . "," . $hours . $hour_text . ", " . $minutes . $minute_text . ", " . $seconds . $second_text;

Sådan kan det laves ;)
Avatar billede coderdk Praktikant
20. maj 2008 - 15:26 #8
<> skal være != og kan også skrives:

$day_text = $days . 'dag' . ( $days != 1 ? 'e' : '' );

osv

gulvlugt - kan vi se koden?
Avatar billede gulvlugt Nybegynder
20. maj 2008 - 15:30 #9
Hm.. Nej, fordi der er noget jeg ikke helt forstår.

Vi starter lige forfra.

Jeg har felterne:
time
category
amount

Time ser således ud: 2008-05-06 14:24:01
Category ser således ud: DAY
Amount ser således ud: 30

Koden skal kigge i databasen og se hvad time er (den bliver skrevet ind når brugeren bliver oprettet). Så skal den kigge efter om den skal trække SECONDS, HOURS osv. fra. Og derefter hvor mange. Forstår i?

Det skal ende med at den trækker 30 dage fra hvornår brugeren blev oprettet, og så udskrive hvor lang tid af lejeperioden der er tilbage. Kan i stadig følge mig?
Avatar billede asn24 Nybegynder
20. maj 2008 - 15:33 #10
coderdk -> Hvad er forskellen?

Jeg må indrømme jeg ikke helt forstår hvor det er du vil hen gulvlugt..
Avatar billede coderdk Praktikant
20. maj 2008 - 15:49 #11
asn24, Sorry, <> virker som != det er bare ren vane at jeg bruger !=

gulvlugt, mener du noget i stil med:

$sql = "SELECT time, amount, category FROM user WHERE userid = 1234";
$qh = mysql_query( $sql ) or die( mysql_error() );
$row = mysql_fetch_assoc( $qh );
mysql_free_result( $qh );
$start = strtotime( $row['time'] );
if ( $row['category'] == 'DAY' )
{
  $start = strtotime( '+' . $row['amount'] . ' DAY' );
  if ( $start < time() )
  {
      echo "Lejeperioden er ovre";
  }
  else
  {
      $time_diff = $start - time();
      $days = floor($time_dif / 86400);
      $time_dif -= $days*86400;
      $hours = floor($time_dif / 3600);
      $time_dif -= $hours*3600;
      $minutes = ($time_dif /60);
      $seconds = floor( $time_dif - ($minutes*60) );
      echo $days."dag".($days!=1?'e':'').", ".$hours."time".($hours!=1?'r':'').", ".$minutes."minut".($minutes!=1?'ter':'').", ".$seconds."sekund".($seconds!=1?'er':'');
  }
}
Avatar billede gulvlugt Nybegynder
20. maj 2008 - 16:37 #12
Den udskriver bare:
0dage, 0timer, 0minutter, 0sekunder
Avatar billede coderdk Praktikant
20. maj 2008 - 16:57 #13
lad os se koden ;P
Avatar billede gulvlugt Nybegynder
20. maj 2008 - 17:34 #14
$sql = "SELECT time, amount, category FROM scplogin WHERE control = '$show[control]'";
$qh = mysql_query( $sql ) or die( mysql_error() );
$row = mysql_fetch_assoc( $qh );
mysql_free_result( $qh );
$start = strtotime( $row['time'] );
if ( $row['category'] == 'DAY' )
{
  $start = strtotime( '+' . $row['amount'] . ' DAY' );
  if ( $start < time() )
  {
      echo "Lejeperioden er ovre";
  }
  else
  {
      $time_diff = $start - time();
      $days = floor($time_dif / 86400);
      $time_dif -= $days*86400;
      $hours = floor($time_dif / 3600);
      $time_dif -= $hours*3600;
      $minutes = ($time_dif /60);
      $seconds = floor( $time_dif - ($minutes*60) );
      echo $days."dag".($days!=1?'e':'').", ".$hours."time".($hours!=1?'r':'').", ".$minutes."minut".($minutes!=1?'ter':'').", ".$seconds."sekund".($seconds!=1?'er':'');
  }
}
Avatar billede coderdk Praktikant
20. maj 2008 - 17:58 #15
Prøv at skrive

var_dump( $row );
var_dump( $start );

før $time_diff = $start - time();

For det lader jo til, at du får noget ud af forespørgslen...
Avatar billede gulvlugt Nybegynder
20. maj 2008 - 22:30 #16
Nu udskriver den:
array(3) { ["time"]=>  string(19) "2008-05-06 14:24:01" ["amount"]=>  string(2) "30" ["category"]=>  string(3) "DAY" } int(1213907262) 0dage, 0timer, 0minutter, 0sekunder
Avatar billede coderdk Praktikant
20. maj 2008 - 23:23 #17
$time_diff = $start - time();

skal være

$time_dif = $start - time();

og

$start = strtotime( '+' . $row['amount'] . ' DAY' );

skal være

$start = strtotime( '+' . $row['amount'] . ' DAY', $start );

og

$minutes = ($time_dif /60);

skal være

$minutes = floor($time_dif /60);
Avatar billede gulvlugt Nybegynder
24. maj 2008 - 12:58 #18
Det funker. Tak.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester