Avatar billede rune.osterdal.com Nybegynder
17. september 2003 - 21:58 Der er 9 kommentarer og
1 løsning

date() formatering af TIMESTAMP

Jeg har et timestamp i min database der indsættes når en bruger logger på :

UPDATE $tablename SET sidstonline = NOW() WHERE brugernavn = '$brugernavn';

Jeg skal så skrive tidspunktet ned med en date() formatering for alle seks brugere :

while ($row = mysql_fetch_row($result)){
    $tidspunkt = date("j/n Y H:i", $row[1]);
    print $row[1]." : ".$tidspunkt."<br>";
}

Jeg skriver altså først timestamp og derefter formateringen.. MEN resultatet er dette :

20030917215431 : 19/1 2038 04:14
20030917161102 : 19/1 2038 04:14
20030917153448 : 19/1 2038 04:14
20030917153426 : 19/1 2038 04:14
20030917024621 : 19/1 2038 04:14
20001202111254 : 19/1 2038 04:14 (forsøg med time() i PHP i stedet for NOW() i SQL)

Hvorfor formaterer den ikke timestamp korrekt men 35 år ud i fremtiden?
Avatar billede nicklasb Nybegynder
17. september 2003 - 22:15 #1
fordi at timestampet 20030917024621 og vel også alle de andre, ligger på den anden side af år 2038..
2147483647 er faktisk max..
Det før får ved at skrive NOW er derimod et datetime.. Prøv at skille den ad.. Der står år 2003 måned 09 dag 17 kl 02:46:21
Prøv at bruge time() i php i stedet.. :D
Avatar billede detox Nybegynder
17. september 2003 - 22:22 #2
Du kan osse hive timestampet ud som unix, så din date() funktion virker:

SELECT UNIX_TIMESTAMP(timestamp_felt) AS unix FROM tabel
Avatar billede nicklasb Nybegynder
17. september 2003 - 22:31 #3
vil nu aligevel holde på at det er lettest at ligge time() ind i et int-felt..
Og så er der også en anden, og helt klar fordel ved at gøre det på den måde..
Har du siden hos en bare lidt større host, har han ikke sql-servere og http-servere på samme maskine.. Og er tidsforskellen på disse bare et par sekunder bliver usikkerheden af din beregninge yderligere stor.. Og i et eksempel som det du selv giver med onlinetid er det da en hel del vigtigt med sekunder (for ikke at tale om evt minutter..)
Især hvis du senere vil lave en onlineliste der bygger på besøg inden for fx de seneste 5 min..
Har aldrig selv været glad for at bruge timefunktionen fra databasen.. PHP's derimod har jeg aldrig haft problemmer med..
Fortæl mig hvis jeg tager fejl..
Avatar billede detox Nybegynder
17. september 2003 - 22:41 #4
Tja, det er nok smag og behag. Man må vel forvente at tiden på serverne går nogenlunde rigtigt. Eksemplet med onlinelisten, kan man jo bare generere udelukkende udfra tiden på sql-serveren, så fejler præsisionen ikke noget. Jeg tror bare det er en smagssag om man vil benytte mysql's indbyggede funktioner eller ej.
Avatar billede nicklasb Nybegynder
17. september 2003 - 22:47 #5
det er ikke bare et spørgsmål om smag og behag med dit tidligere eksempel.. Der ligger du netop op til at der senere skal tjekkes om mod en database.. Hvis du skal hente noget af tiden fra en database, skal du også hente den resterende del.. Og vil du så også have et lille ur eller ligende på din side, gør det også en del hvis databasens ur går forskelligt fra http-serverens ( i tilfælde af at du altså henter onlinetiden derfra.. )
Syntes ikke det har det fjerneste med smag og behag at gøre.. ( Jo måske DÅRLIG smag.. Men ellers ikke.. :)
Og hvorfor blande din sql ind i det, når det OVERHOVEDET ikke er nødvendigt.. Faktisk mindst lige så let bare at bruge time i php.. Og så er du sikker på et rigtigt og præcist resultat..
Så hvad er problemet med den løsning ?
Avatar billede nicklasb Nybegynder
17. september 2003 - 22:49 #6
vrøvl.. Selvfølge: Der ligger du netop op til at der senere skal tjekkes om mod php's time..
Avatar billede rune.osterdal.com Nybegynder
17. september 2003 - 22:49 #7
Tak for hjælpen ;-)

Time() i INT-felt virker...

Vil I have point?
Avatar billede nicklasb Nybegynder
17. september 2003 - 22:50 #8
joo .. kan da godt lige svare.. :D Glad for at du fik det til at virke.. :D
Avatar billede detox Nybegynder
17. september 2003 - 23:19 #9
Det er da på intet tidspunkt nødvendigt at bruge php's tid til noget. Du kan da hente resultatet direkte i mysql.
Det eneste problem jeg ser i din løsning er, at du afskærer dig fra at bruge mysql's indbyggede funktioner. Se fx:
http://www.mysql.com/doc/en/Date_and_time_functions.html
Alverdens beregninger og formateringer. Sågar 1/1000000 sekunder, så præcisionen fejler ikke noget. Andre eks. kunne være diverse intervaller, ugenumre/dage og formateringen til ovenstående spørsmål kan nemt løses med:

SELECT DATE_FORMAT( tid, '%d/%m %Y %H:%i') AS dato

Personligt foretrækker jeg at bruge de muligheder mysql byder på.
Avatar billede rune.osterdal.com Nybegynder
19. september 2003 - 16:18 #10
tak for hjælpen ;-)
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