Europees input type 'date' vertaalt naar yyyy-mm-dd in feedback form. Hoe verander je de output?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Timia Breederveld

Timia Breederveld

13/06/2017 17:41:17
Quote Anchor link
Ik heb een pagina waar men via een formulier een Europese datum (met input type='date') kan kiezen om iets te laten gebeuren. Er komt geen database aan te pas en de ingevulde info gaat direct per e-mail naar mij. Ik krijg echter als resultaat yyyy-mm-dd. Heb al veel varianten $date=... geprobeerd maar niets lijkt te werken (vreemd genoeg).
Het zou toch vrij simpel moeten zijn lijkt mij. Kom er toch niet uit.
Ik vraag niet om een 'quick fix', maar wil wel graag begrijpen waarom de datum zowiezo veranderd van dd-mm-yyyy naar yyyy-mm-dd en hoe dat op te lossen.
 
PHP hulp

PHP hulp

27/12/2024 04:41:14
 
Adoptive Solution

Adoptive Solution

13/06/2017 18:30:43
Quote Anchor link
Zit hier de oplossing bij :

https://stackoverflow.com/questions/2487921/convert-date-format-yyyy-mm-dd-dd-mm-yyyy

Zag er dit (plus wat toevoegingen) :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$orgdate
= '2012-07-31';
$source = $orgdate;
$date = new DateTime($source);
echo $orgdate . '<br />';
echo $date->format('d.m.Y') . '<br />'; // 31.07.2012
echo $date->format('d-m-Y'); // 31-07-2012
?>
 
Timia Breederveld

Timia Breederveld

13/06/2017 18:42:34
Quote Anchor link
Bedankt. Ga ik mee aan de slag en antwoord op het waarom nu ook gevonden via je link naar stackoverflow.
 
Rob Doemaarwat

Rob Doemaarwat

13/06/2017 21:51:32
Quote Anchor link
Het idee is dat de gebruiker aan de voorkant een datum in kan voeren in z'n eigen formaat (dd-mm-yyyy voor ons, maar mm/dd/yyyy voor een Amerikaanse gebruiker), en dat 'onder water' (dus ook in een POST) het formaat altijd naar een en dezelfde standaard wordt gedrukt (yyyy-mm-dd dus).
 
Frank Nietbelangrijk

Frank Nietbelangrijk

13/06/2017 21:53:34
Quote Anchor link
>> Ik vraag niet om een 'quick fix', maar wil wel graag begrijpen waarom de datum zowiezo veranderd van dd-mm-yyyy naar yyyy-mm-dd en hoe dat op te lossen.

Een datum wordt gewoon in de meeste (of alle?) talen en programma's opgeslagen als een geheel getal. Het UNIX timestamp telt bijvoorbeeld de secondes vanaf 01-01-1970 0:00:00. Dit biedt twee voordelen:

a) de computer kan zonder vertaalslag direct gaan rekenen met deze getallen. (bijv. de maand berekenen maar ook het verschil in dagen berekenen tussen twee getallen)

b) het neemt minder geheugenruimte in. (32 bits)


>> Zag er dit (plus wat toevoegingen)

Dat kan korter.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$date
= new DateTime('2012-07-31'); // dit wordt omgezet naar een datum-getal
echo $date->format('d.m.Y') . '<br />'; // 31.07.2012 (bouw het getal om naar een string met dag.maand.jaar)
echo $date->format('d-m-Y'); // 31-07-2012 (bouw het getal om naar een string met dag-maand-jaar)
?>
 
Timia Breederveld

Timia Breederveld

13/06/2017 21:56:06
Quote Anchor link
Bedankt Rob en Frank!
 
Thomas van den Heuvel

Thomas van den Heuvel

14/06/2017 00:53:13
Quote Anchor link
Frank Nietbelangrijk op 13/06/2017 21:53:34:
a) de computer kan zonder vertaalslag direct gaan rekenen met deze getallen. (bijv. de maand berekenen maar ook het verschil in dagen berekenen tussen twee getallen)


Mogelijk bedoel je hier dat yyyymmdd lexicografisch (alfabetisch) geordend is? Het gewicht jaar "weegt" zwaarder dan maand wat op zijn beurt zwaarder weegt dan dag van de maand. Omdat de yyyymmdd tekststring op een zinnige manier is geordend (aflopende volgorde van gewicht) kun je hier ook alfabetische tekstvergelijkingen mee doen die hout snijden uit oogpunt van tijd (bijvoorbeeld '2017-07-01' valt na '2017-06-30' en tevens geldt '2017-07-01' > '2017-06-30'). Met andere formaten kun je dat niet (of niet makkelijk) doen.

Als je overigens niet wilt dat iemand de vrijheid heeft om iets op een bepaalde manier in te vullen, geef deze vrijheid dan ook niet :p. Maak of gebruik van dropdowns voor dag, maand of jaar of maak gebruik van een datepicker ofzo. Neemt de kans haast in het geheel weg dat een datum in het verkeerde formaat wordt aangeleverd omdat je met voorgaande genoemde manieren zelf voorschrijft hoe dit formaat zou moeten zijn.
 
Ivo P

Ivo P

14/06/2017 05:17:05
Quote Anchor link
Ik liep er vorige week tegenaan dat de vertaalslag Browser afhankelijk was.

Firefox wad het volgens mij die 31-12-2017 doorgaf en Chrome draaide hem om.
 
Rob Doemaarwat

Rob Doemaarwat

14/06/2017 07:44:59
Quote Anchor link
Firefox ondersteunt input type='date' nog (steeds) niet (http://caniuse.com/#search=date). Dan wordt het eigenlijk gewoon een type='text', en zul je de invoer van de gebruiker letterlijk doorkrijgen in je back-end. Je zult dus even moeten checken of deze in het juiste formaat is (/^\d{4}-\d{2}-\d{2}$/), en anders gokken wat het gebruikte formaat dan wel is, en een conversie doen (of helemaal af zien van type='date' en een eigen datum kiezer gebruiken, bijvoorbeeld jQuery.datepicker()).
 
Willem vp

Willem vp

15/06/2017 16:44:14
Quote Anchor link
Frank Nietbelangrijk op 13/06/2017 21:53:34:
Een datum wordt gewoon in de meeste (of alle?) talen en programma's opgeslagen als een geheel getal. Het UNIX timestamp telt bijvoorbeeld de secondes vanaf 01-01-1970 0:00:00. Dit biedt twee voordelen:

b) het neemt minder geheugenruimte in. (32 bits)

Die 32-bits integer loopt ergens in het begin van 2038 vol, en dan zijn de rapen gaar. En iemand die denkt dat dat geen probleem is omdat dat nog 20 jaar duurt, heeft niets geleerd van Y2K. Overigens kun je er nu ook al last van hebben. Probeer bijvoorbeeld maar eens uit te rekenen hoeveel hypotheekrente je over 25 jaar moet betalen.

Elke zichzelf respecterende programmeertaal zal een timestamp dus niet meer opslaan in een 32-bits integer, maar in plaats daarvan een 64-bits integer gebruiken. Probeer het volgende maar eens (60-bits integer):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
print_r(localtime(0xfffffffffffffff, true));
?>

PHP rekent dit netjes om naar 13 mei 36534630048. Oftewel: intern wordt gebruik gemaakt van een 64-bits integer. Ik kan het dan ook niet echt verstandig noemen om een timestamp in een 32-bits integer op te slaan. In goed Engels heet dat: "setting yourself up fo failure."

Wanneer je het hebt over runtime geheugengebruik, gaat je argument "neemt minder ruimte in" dus niet op. En hoe zit dat bij MySQL? Een BIGINT gebruikt 8 bytes aan storage space, een DATETIME 5 en een DATE zelfs maar 3 bytes.

Het heeft dus zo zijn voordelen om de datum in een DATETIME of DATE op te slaan. Niet alleen gebruikt dat minder ruimte, ook is het leesbaar voor mensen, wat bijvoorbeeld debuggen een stuk fijner maakt.
 
Timia Breederveld

Timia Breederveld

15/06/2017 16:48:04
Quote Anchor link
Bedankt allen!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.