Avatar billede skolestofdk Nybegynder
19. november 2006 - 18:40 Der er 14 kommentarer og
1 løsning

DATETIME, antal minuter til given dato

Jeg har i en tabel: følgende:

shoutoutend DATETIME,

I denne er der fx. 2006-12-12 19:12:59

Det jeg gerne vil er så, at se hvor mange "timer og minuter" der er fra dags dato og frem til det tidspunkt som der er i "shoutoutend" ..

og så selvfølgelig echo.. resultatet...
Avatar billede intel4004 Novice
19. november 2006 - 23:11 #1
Jeg går udfra at "shoutoutend" er et felt af typen DATATIME i en MySQL tabel?

MySQL kan konvertere DATETIME felter til unixtimestamp værdien med UNIX_TIMESTAMP().

SQLQUERY: SELECT UNIX_TIMESTAMP(shoutoutend) AS shoutoutend_timestamp IN din_tabel

Når du har denne værdi (eksempelvis i variablen $shoutoutend_timestamp kan du gøre følgende:

<?php
//$shoutoutend_timestamp har fået værdi fra database

echo $date("r", $shoutoutend_timestamp - time());
?>

Mvh Intel4004
Avatar billede skolestofdk Nybegynder
20. november 2006 - 16:00 #2
for følgende fejl:
Fatal error: Call to undefined function: () in  . . bla. bla. bla. . on line 178

og line 178 er:  echo $date("r", $shoutoutend_timestamp - time());
Avatar billede intel4004 Novice
20. november 2006 - 17:07 #3
hov...der var lige røget et $ på funktionskaldet. Fjern dollartegnet foran "date()" så tror jeg det virker.

Mvh Intel4004
Avatar billede skolestofdk Nybegynder
20. november 2006 - 21:42 #4
Den kommer ikke med en fejl: men tiden den spytter ud/echo: ser sådan ud.??????? 
Sat, 11 Feb 1933 04:15:31 +0100 øhh???

Vil gerne have der står: fx.

TID TILBAGE: 11:13:04 og så den tæller ned..
Avatar billede intel4004 Novice
23. november 2006 - 10:46 #5
Nu jeg tænker mig om så ved jeg egentlig ikke rigtig hvorfor jeg vil have dig til at bruge date()...

Det du har brug er antal sekunder til et tidspunkt.

<?php
$fortid = false;
$sekunder = $shoutoutend_timestamp - time();
if ($sekunder < 0)
{
  $sekunder = $sekunder * (-1);
  $fortid = true;
}

$timer = abs($sekunder / 3600);
$sekunder = $sekunder - ($timer * 3600);

$minutter = abs($sekunder / 60);
$sekunder = $sekunder - ($minutter * 60);

echo ($fortid ? '-' : '');
echo $timer.':'.$minutter.':'.$sekunder;
?>

Men ang. det med at få den til at tælle ned dynamisk så skal du nok over i javascript.

Mvh Intel4004
Avatar billede skolestofdk Nybegynder
25. november 2006 - 20:33 #6
Endnu en gang er resulatet af echo: "-323467.622222:0:0" - øhh? og det resultat som skulle have stået er: 23:14:56..??

Hvad representer $fortid?
Avatar billede intel4004 Novice
26. november 2006 - 00:34 #7
Hvad er der i $shoutoutend_timestamp når du får "-323467.622222:0:0"?

Jeg gør sådan her:
<?php
$sekunder = $shoutoutend_timestamp - time();
?>

Hvis så timestamp er i fortiden i forhold til nu (i time()), så vil resultatet jo være negativt. Derfor jeg sætter jeg $fortid = true hvis dette er tilfældet. Derefter skifter jeg fortegnet så det bliver positivt. Jeg bruger det så til at sætte et minus foran det udskrevede resultat - ligesom for at designere at det er i fortiden.

Prøv at skrive istedet for:
<?php
$sekunder = abs($shoutoutend_timestamp - time());
?>

Mvh Intel4004
Avatar billede skolestofdk Nybegynder
26. november 2006 - 15:11 #8
Lad os lige tage den forfra:..... er noget forviret..

Har en table i MySQL som hedder: "shoutout"

I den er der et felt som hedder: "shoutoutend" af Datatype DATETIME

I feletet "shoutoutend" vil der ALTID være en dato som er et sted i fremtiden, og det kan være alt fra. 24 timer og ned til 10 min fx. 2006-11-26 14:50:55
og den vil ALDRIG kunne være negativ, hvis du forestår...

Det jeg gerne vil er, at se hvormange "timer:min:sek" der er fra "nu og her" og frem til det tidspunkt der er i feltet "shoutoutend"...
Avatar billede skolestofdk Nybegynder
26. november 2006 - 15:12 #9
ups: fx. 2006-11-27 14:50:55
Avatar billede skolestofdk Nybegynder
26. november 2006 - 15:27 #10
Koden ser således ud: (tror der er fejl i)

$shoutoutend = mysql_query("SELECT UNIX_TIMESTAMP(shoutoutend) AS shoutoutend IN shoutout WHERE id = $row[id]");

$fortid = false;
$sekunder = abs($shoutoutend - time());

if ($sekunder < 0)
{
  $sekunder = $sekunder * (-1);
  $fortid = true;
}

$timer = abs($sekunder / 3600);
$sekunder = $sekunder - ($timer * 3600);

$minutter = abs($sekunder / 60);
$sekunder = $sekunder - ($minutter * 60);

echo ($fortid ? '-' : '');
echo $timer.':'.$minutter.':'.$sekunder;

i feltet "shoutoutend" i MySQL er der følgende dato: 2006-11-27 14:25:38

og det her er hvad den spytter ud, når man echo: "323486.5475:0:0"

Køre på MySQL 4.0.21 hvis det har noget at skulle have sagt:..
Avatar billede intel4004 Novice
26. november 2006 - 21:40 #11
Det som jeg muligvis tror er fejlen er din mysql query:

Prøv med:

$shoutoutend_result = mysql_query("SELECT UNIX_TIMESTAMP(shoutoutend) AS shoutoutend_timestamp IN shoutout WHERE id = $row[id]");

Og brug derefter det ny pseudo-felt "shoutoutend_timestamp". Men det er ikke sikker at dette er fejlen. I dit ovenstående kode ser det ud som om du bruger $shoutoutend direkte. Det er jo et database resource som skal læses specielt.

Det som er hele ideen i det jeg forslår er at du henter et unix-timestamp fra databasen. Et unix-timestamp er antal sekunder siden 01-01-1970. I php får du nuværrende timestamp med time().

Forestil dig at der i databasen ligger datoen: 2008-01-01 11:39:00, altså et tidspunkt som lige nu ligger i fremtiden. Med SQL funktionen UNIX_TIMESTAMP får man timestamp 1199209140.

dvs:
$shoutoutend = 1199209140;

kl. 20:15:07 idag (2006-11-27 20:15:07) er timestamp 1164680107.

dvs:
$now = 1164679200;

Forskellen er: $sekunder = abs($shoutoutend - $now //

Denne forskel er: 34529033 sekunder.

Så udregner jeg tiden i timer, minutter, sekunder:

$timer = abs($sekunder / 3600); // 9591 timer (altså mere end et år)
$sekunder = $sekunder - ($timer * 3600);

Så er der nu 1433 sekunder tilbage som vi udregner minutter ud fra:
$minutter = abs($sekunder / 60); // 23 minutter
$sekunder = $sekunder - ($minutter * 60);

sekunder opdateres og der er 53 sekunder tilbage.
echo $timer.':'.$minutter.':'.$sekunder;

output er: "9591:23:53". Man kan selvfølgelig udskrive antal dage, uger, måneder, år...osv. hvis man vil. Udregningen er simpel.

Mvh Intel4004
Avatar billede intel4004 Novice
27. november 2006 - 20:06 #12
Jeg var åbenbart overbevist om at det var d. 27 igår...det var ikke for at forvirre yderligere :)

Mvh Intel4004
Avatar billede skolestofdk Nybegynder
30. november 2006 - 17:06 #13
Kan ikke få det til at passe, for ikke noget output fra sql'en?? hmm.. Har prøvet op og ned, højre og venstre.. men den vil ikke lystre... og kan sagtens følge dig i hvad du gøre...

Hvordan kommer min kode til at se ud, den hele, så kan jeg se om det er mig eller hvad...
Avatar billede intel4004 Novice
30. november 2006 - 18:20 #14
Mit bud kunne være:

<?php
$result = mysql_query(
  "SELECT UNIX_TIMESTAMP(shoutoutend) AS shoutoutend_timestamp
  IN shoutout WHERE id = $row['id']"
);

$current_time = time();
while ($row = mysql_fetch_array($result))
{
  $shoutoutend = intval($row['shoutoutend_timestamp']);

  $sekunder = abs($shoutoutend - $current_time);

  $timer = abs($sekunder / 3600);
  $sekunder = $sekunder - ($timer * 3600);

  $minutter = abs($sekunder / 60);
  $sekunder = $sekunder - ($minutter * 60);

  echo $timer.':'.$minutter.':'.$sekunder;
}
?>

Men jeg har ikke rørt ved din where-clause hvori du bruger "$row['id']"...

Jeg ved ikke hvad dit problem er. Jeg går ikke udfra at mit kode viser noget nyt som du ikke vidste. Jeg går udfra du er bekendt med standard udtræk fra database med mysql_fetch_array()...?

Mvh Intel4004
Avatar billede intel4004 Novice
30. november 2006 - 19:51 #15
Hej igen...

Hvis du bare copy-paster det kode, får nok du en fejl.

Dette her:

$result = mysql_query(
  "SELECT UNIX_TIMESTAMP(shoutoutend) AS shoutoutend_timestamp
  IN shoutout WHERE id = $row['id']"
);

skal være:

$result = mysql_query(
  "SELECT UNIX_TIMESTAMP(shoutoutend) AS shoutoutend_timestamp
  IN shoutout WHERE id = ".$row['id']
);

Mvh Intel4004
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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