Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  3 992
Hallo alle sammen!
Jeg trenger litt hjelp av dere vise freaker angående et tema så viktig at det er unødvendig å fortelle dere konsekvensene om dette ikke blir løst umiddelbart! Hvordan kan man best lagre å bruke datoer i php og mysql? Mer spesifikt: hvordan man kan finne ut hvor mange år, måneder og dager det er siden en dato som er lagret i databasen, og på hvilken form burde denne datoen være lagret?
Sist endret av Darkness123; 1. august 2010 kl. 02:08.
Hva som er best er vel kanskje opp til hver enkelt, jeg bruker datetime i mysql noen ganger. Men prøver å bruke php-funksjonen time() mest mulig. Hvis du skal finne ut "hvor lenge" siden, så finnes det mange ferdige funksjoner om du googler.
http://www.java-samples.com/showtuto...tutorialid=999

Google litt rundt det, så finner du ut hvordan du kan bruke mktime sammen med date() feks.
Limited edition
Moff's Avatar
Jeg synes det er best å bruke mysql sin innebygde timestamp-funksjon. Det er en datatype du kan velge på linje med varchar, som bare viser en dato. Siden dette er en funksjon fra mysql-databasen, så er den litt mer fleksibel enn time() i PHP - gitt at du trenger litt fleksibel funksjonalitet, som å finne datoer mellom x og y, eller alle oppføringer på samme dato som et gitt klokkeslett.

For ditt spesifikke problem derimot, så ville jeg satset på å bruke time() i PHP. time() viser hvor mange sekunder det er gått siden 1. januar 1970, og du kan derfor veldig lett regne ut hvor lenge siden noe var - med nøyaktighet ned til nærmeste sekund.

Kode

<?php
// Her er timestampen til det som skjedde:
$it = 1180706951;

// Dette er nåtid:
$now = time();

// Hvor mange sekunder har gått siden det skjedde?
$time = $now - $it;

// Så lenge:
echo "Det har gått $time sekunder siden det skjedde.<br />";

/* Nå ville JEG vært fornøyd - men i tilfelle du virkelig trenger å se hvor lang
tid det er snakk om, så kan vi gå litt lengre. Mennesker klarer ikke å se store
tidsperspektiv i sekunder. PHP har ikke noen handy funksjon for å konvertere
det til noe lesbart, men matematikken bak det er ganske enkel. Du trenger å
forstå hvordan modulus (%)-operatøren funker, og lage din egen funksjon.
Slik som dette: */
function sec_to_weeksnstuff($time) {
	/* Her har vi uker (w), dager (d), timer (h) and so on. For å utvide til år og sånt,
	så trenger du bare å fortsette logikken ved å bruke modulus på ukene, og legge til år
	som høyeste verdi. */
	$w = intval($time / 86400 / 7); // X delt på sekunder i ett døgn delt på én uke
	$d = $time / 86400 % 7; // Rest når X delt på sekunder i ett døgn deles på én uke
	$h = $time / 3600 % 24; // Rest når X delt på sekunder i én time deles på ett døgn
	$m = $time / 60 % 60; // Rest når X delt på sekunder i ett minutt deles på ett minutt
	$s = $time % 60; // Rest når X deles på ett minutt
	return "Det tilsvarer $w uke(r), $d dag(er), $h time(r), $m minutt(er) og $s sekund(er) siden det skjedde.";
}
// Kjør funksjonen med timestampen vi har:
echo sec_to_weeksnstuff($time);
?>
Om du ikke har kommet til den delen med modulus i matematikken, så kan jeg fortelle at den returnerer det du har igjen (resten) når du deler A på B. Jeg fortrekker å tenke slik at A nullstilles hver gang A går opp i B. Et relevant eksempel; Du har 15 dager og vil vite hvor mange uker dette er, uten å vise et desimalsvar. Det er 7 dager i ei uke, så vi skriver 15%7. Dette gir svaret 1. Du vet sikkert at det er 14 dager i 2 uker - A går altså opp i B 2 ganger (14) og vi får vite at 15 dager er 2 uker og 1 dag. Så - for å utvide funksjonen til å regne med år, så kan jeg tipse deg om at det er litt i overkant av 52 uker i ett år, så det vil være naturlig å endre første linje til "$w = intval($time / 86400 / 7) % 52;". Da står du igjen med antall uker som er igjen etter at alle hele år er trukket vekk fra alle ukene. intval()-en er der forøvrig for å strippe desimalene fra delestykket.

Fordelen ved å putte konverteringen i en funksjon er at du da kan bruker sec_to_weeksnstuff() hvor som helst, uten å måtte sette opp regnestykkene på nytt hver eneste gang. Det kan være smart å endre det slik at funksjonen returnerer et array med antall uker, dager og sånt, i stedet for en ferdig formatert string. Det gir litt større fleksibilitet. I tillegg kan du legge til noen if-løkker for å sjekke om det er ingen eller mer enn én av hver enhet (x < 1 || 0), slik at det ikke står "uke(r)", men heller "uker", "uke" eller ingenting hvis det er 0. Det ser litt mer smooth ut.