[PHP] Datum verwerking / berekenen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Er zijn al aardig wat topics te vinden en deze heb ik ook serieus goed doorgenomen, maar het wordt me eerder minder duidelijk dan duidelijker hierdoor. Ik kan door de bomen het bos niet meer zien ondertussen met alle verschillende type velden, datetime, timestamp, time, date, unix dit dat...

Het zit zo:

Ik heb een admin-systeempje voor nieuwsberichtjes. Nu wil ik graag maken dat je een nieuw bericht kan toevoegen en opgeven op welke datum het bericht op de site moet komen, en vanaf welke datum hij niet meer zichtbaar moet zijn.

Kan iemand mij duidelijke opheldering verschaffen, met hoe dit ongeveer in zijn werk zou moeten gaan? B)

Acties:
  • 0 Henk 'm!

Verwijderd

Waar sla je dit in op? In een SQL-database? Je kunt daar twee velden aanmaken van het type datum. Hier is wel genoeg over geschreven in de verschillende FAQ's op het web.

Zelf sla ik die unix-time op (dat is het aantal seconden sinds 1970 dacht ik), zo was het systeem waar ik aan werk geimplementeerd. Met time() krijg je de huidige tijd en er zijn genoeg functies te vinden die van een datumstring (bv "10-10-2005") een unixtime maken.

Wat je doet, moet je zelf weten :) Ik vind het werken met unixtime wel handig.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja, in een SQL db, inderdaad.

Dat is dus de timestamp variant.

Maar als ik dan zeg maar in het invul veld:' 01-01-2006' zet en die moet ik opslaan als timestamp daarna. Hoe krijg ik dat dan voor elkaar? Dan moet ik die converteren op een of andere manier?
Dat vat ik niet helemaal nog.

Ik heb inderdaad twee velden in mijn DB: datumonline, datumoffline type timestamp.

Acties:
  • 0 Henk 'm!

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 14:31
In jouw geval zou ik niet met timestamps werken maar met data (in de vorm yyyy-mm-dd); mocht je toch willen converteren, kijk dan eens naar strtotime en/of explode.

Acties:
  • 0 Henk 'm!

Verwijderd

Timestamps zou ik voor alleen datums niet gebruiken nee. Als je het veld date maakt, kun je het er volgens mij direct inzetten, maar daarvoor zou je even moeten zoeken op sql date of iets dergelijks.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok, maar dat had ik al een klein beetje.

Ik had twee velden allebei DATE type.
Deze waren gevuld met yyyy-mm-dd en die werden in de input velden
ge-echod in dd-mm-yyyy. Als je dat dan opslaat wordt het weer teruggedraaid naar yyyy-mm-dd.

Ohja, en dan kan ik met 'DATE_FORMAT( datumonline, '%d-%m-%Y' ) AS datumon' het omdraaien.

Maar nu moet ik op de website natuurlijk code hebben die ervoor zorgt dat als de datumonline
van het nieuwsbericht hetzelfde of 'groter' is dan de huidige datum. En als de huidige datum groter is dan datumoffline of hetzelfde dan moet het bericht niet meer worden weergegeven.

[ Voor 10% gewijzigd door Verwijderd op 18-11-2005 14:38 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Zoek maar even op date-functies in SQL. Je kunt in je sql-query testen of de huidige datum tussen die 2 data ligt of niet.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
True, dat kan met 'BETWEEN '11-06-2005' AND '12-07-2005" volgens mij.

Acties:
  • 0 Henk 'm!

Verwijderd

Nou, mooi, heb je het probleem al opgelost ja :) Wat was hier nou precies het probleem? We hebben je niet echt geholpen, je had het probleem al bijna opgelost volgens mij B)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hehe, mjah nee, dit is allemaal gewoon logisch nadenken.
Maar op een of andere manier krijg ik het niet voor elkaar qua scripting..

Ik moet alles nog een beetje aan elkaar knopen, denk ik ofzo :P

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Hoe je je datum opslaat in je DB is je eigen zaak, maar ik zou gewoon een DATE veld pakken. Sla daar bijvoorbeeld als datum 2006-01-01 (standaardformaat voor data in MySQL) in op voor je nieuwsbericht. Vervolgens hoef je bij het weergeven van het nieuws op je site alleen maar daarmee rekening te houden in je select-query:
SQL:
1
2
3
SELECT ...wat je wil selecten...
FROM `nieuws`
WHERE `datum` <= NOW()

Waarbij datum uiteraard het veld is waar je die datum in opslaat. Pas wel op dat je dat veld van het type DATE maakt, en niet van het type TIMESTAMP.

Datzelfde kan dus ook uitgebreider met BETWEEN zoals je zelf al aangaf.

[ Voor 7% gewijzigd door NMe op 18-11-2005 14:49 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Als je de nieuwsberichten ophaalt, zet je in de SQL-query gewoon die BETWEEN, klaar :)

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Wat concreet je probleem is vat ik nog niet helemaal. Wat ik je wel kan meedelen is dat het binnen PHP het fijnst werkt met timestamps (ergo het aantal s sinds 1970). Alle (op wat conversiefuncties na) datum en tijd functies in PHP werken met dit formaat. In veel gevallen kun het ook prima gebruiken om datums op te slaan in je database. Er kleven echter een aantal nadelen aan het opslaan van timestamps in de DB:
1. De timestamp heeft nauwelijks betekenis wanneer je in de rauwe data kijkt.
2. Je schakelt de (erg goede) date-time functies van MySQL uit.

Het gebruiken van een DATE veld in MySQL biedt dus wat voordelen. Daarnaast is er ook native support voor de unix timestamp. Met FROM_UNIXTIME(*timestamp*) kun je een DATE veld gewoon vullen en met UNIX_TIMESTAMP(*DATE*) kun je er weer een timestamp uitkrijgen. Door een DATE veld te gebruiken kun je dus datums die je direct wil weergevengoed geformat ophalen middels de DATE_FORMAT functie die je zelf al gevonden had. Wil je er in PHP nog mee rekenen dan haal je hem op als timestamp.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Maar, als ik nou bijvoorbeeld een nieuws bericht wil gaan editten. Dan krijg ik het volgende:

datumonline -> ophalen 2006-01-01 -> converteren 01-01-2006 -> echo $datumonline

maar als ik het invulveld edit, en daarna weer UPDATE. Dan moet ik toch zorgen
dat voordat ik UPDATE de datum die ingevoerd is weer is omgedraaid naar het format
in de DB?

Ik bedoel:

Ik vul '01-01-2006' in in het invulveld, maar in de DB moet het zijn '2006-01-01' dus
moet ik op een of andere manier zorgen dat het, voordat het in de DB wordt gestopt,
omgedraaid is..net zoals ik het eruit haal, maar dan andersom:
mysql_query("SELECT *, DATE_FORMAT(datumon, '%d-%m-%Y' ) AS datumonline, DATE_FORMAT(datumoff, '%d-%m-%Y' ) AS datumoffline FROM .....

[ Voor 19% gewijzigd door Verwijderd op 18-11-2005 16:43 ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Verwijderd schreef op vrijdag 18 november 2005 @ 16:40:
Ik vul '01-01-2006' in in het invulveld, maar in de DB moet het zijn '2006-01-01' dus
moet ik op een of andere manier zorgen dat het, voordat het in de DB wordt gestopt,
omgedraaid is..net zoals ik het eruit haal, maar dan andersom:
[...]
Dat kun je toch met PHP:
PHP:
1
2
3
4
5
$inputDate = '01-01-2006';

list($day, $month, $year) = explode('-', $inputDate);

$dbDate = $year .'-' .$month .'-' .$day;

[ Voor 8% gewijzigd door T-MOB op 18-11-2005 17:57 ]

Regeren is vooruitschuiven

Pagina: 1