[php] 2 data vergelijken zonder mktime te gebruiken

Pagina: 1
Acties:
  • 104 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
Ik ben al een tijdje bezig om een script te maken dat data (datums) vergelijkt. en als de datum binnen een bepaalde periode valt dat er dan true op het schrem wordt geschreven en anders false.

De gebruiker kan de gegevens zelf invoeren en worden dan aan een functie meegegeven. Als ik dan de datum 01/01/2006 heb dan geeft hij dan dat dat kleiner is dan 02/10/2005. Maar dat is in werkelijkheid niet zo.

Ik heb zitten zoeken hier op tweakers maar overal wordt gezegt dat je mktime() moet gebruiken.

Ik heb dan dit gedaan.
code:
1
$datum1 = mktime(0,0,0, $_POST['datum1']);

als ik dan een datum opgeef bijvoorbeeld 02/01/2005 dan maakt hij er een tijd van "946767600" als ik dan dit doe maakt hij er weer een datum van.
code:
1
$date = date("d/m/Y H:i:s", $datum );


Als ik alles gewoon behandel als "date" dus
code:
1
$datum = date($_post['startdatum']);

worden de waarden behandeld als een string.

mijn vraag is: Is het niet gewoon mogelijk om 2 data met elkaar te vergelijkenen gewoon als datum dus dat 01/01/2006 na 02/10/2005 komt?

hieronder staat mijn vergelijking
PHP:
1
2
3
4
5
6
7
8
if ($Datum1 >= $Datum2)
{
 echo "true":
}
else
{
 echo "false";
}

[ Voor 10% gewijzigd door Jochemmol op 26-07-2005 15:09 ]

Jochemmol


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

Nee. Date() geeft een string terug. En een string vergelijking is nu eenmaal anders dan een datum vergelijking. Met een timestamp gaat het echter goed. Waarom wil je een timestamp niet gebruiken?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

http://nl2.php.net/strtotime ;)
PHP:
1
2
3
4
5
if (strtotime($datum1) >= strtotime($datum2)) {
  echo "true";
} else {
  echo "false";
}


Dit is overigens wel dubbelop als je inderdaad al die timestamps hebt..die kun je zoals Creepy al zegt toch ook gewoon vergelijken? :?

[ Voor 34% gewijzigd door NMe op 26-07-2005 15:26 ]

'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!

  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
timestamp is met bijvoorbeel mktime()

Ik wil dat niet gebruiken omdat ik dan eerst alle datums moet omzetten naar dus een timestamp.

Als ik mktime wil gebruiken dan moet ik eerst de datum "splitten" omdat de gebruiker dit invoerd 02/03/2005 (bijvoorbeeld) en voor mktime moet ik apart de dag maand en jaar invullen. En dat is vrij onhandig, dus vroeg ik mij af of het niet anders kon.

Jochemmol


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Zelf even een compare functietje maken voor de datum strings zoals je ze binnenkrijgt?

Das toch het idee van programmeren? Dat je af en toe eens wat code schrijft? (nofi)

En over efficiency zou ik me niet zo'n zorgen maken. Goochelen met data/strings is niet echt wat je noemt intensief :)

Acties:
  • 0 Henk 'm!

  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
:) dat is de bedoeling van programmeren. Maar ik vind timestamp niet handig als ik gewone datums binnen krijg. Maar als het niet anders kan maar ik gewoon timestamp van

bedankt voor jullie hulp. Met deze informatie en de GoT SEARCH kom ik er wel uit _/-\o_

Jochemmol


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Tja.. userinput is meestal niet iets waar je intern mee kunt werken. Daar zul je eerst wat mee moeten doen (in het geval van datums dus converteren naar timestamps of ander generiek formaat). Je zult toch ook moeten controleren of er uberhaupts een geldige datum is ingevoerd neem ik aan (checkdate()).

Zelfde als je mensen getallen in laat voeren. Die zul je toch echt even naar int moeten parsen bijvoorbeeld voor je er mee gaat rekenen, anders kan het flink fout lopen :P

[ Voor 14% gewijzigd door Bosmonster op 26-07-2005 15:44 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ivy mompelt iets over:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php

    // define datecompare function
    // (will return
    // true if `inp_datum_een` > `inp_datum_twee`,
    // false otherwise)
    function vergelijk_datums($inp_datum_een, $inp_datum_twee)
    {

        // split date-parts
        $datum[1] = explode("/", $inp_datum_een);
        $datum[2] = explode("/", $inp_datum_twee);

        // create timestamps
        $timestamp[1] = mktime(0, 0, 0, $datum[1][1], $datum[1][0], $datum[1][2]);
        $timestamp[2] = mktime(0, 0, 0, $datum[2][1], $datum[2][0], $datum[2][2]);

        // compare
        $timestamp[1] > $timestamp[2] ? $result = true : $result = false;

        // return result to user
        return $result;

    }

    // init
    $a = '01/01/2006';
    $b = '02/10/2005';

    echo vergelijk_datums($a, $b);

?>

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

ivy, mijn code hierboven doet exact hetzelfde in één regel. :P

offtopic:
Vreemde constructie trouwens:

PHP:
18
19
20
21
22
        // compare
        $timestamp[1] > $timestamp[2] ? $result = true : $result = false;

        // return result to user
        return $result;

offtopic:
Waarom niet gewoon dit? :)

PHP:
18
19
        // compare
        return $timestamp[1] > $timestamp[2];

'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!

  • chielsen
  • Registratie: Oktober 2003
  • Laatst online: 23:33
Je moet eerst nog een timestamp maken he, dat is het eerste stuk van ivy's code.

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

chielsen schreef op dinsdag 26 juli 2005 @ 17:02:
Je moet eerst nog een timestamp maken he, dat is het eerste stuk van ivy's code.
Wat denk je dat strtotime doet? ;)

'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!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

chielsen:
Je moet eerst nog een timestamp maken he, dat is het eerste stuk van ivy's code.
:Z
strtotime -- Parse about any English textual datetime description into a Unix timestamp

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Datums converteer je eigelijk zo snel mogelijk naar een getal ipv een met een string te werken. Je hebt bijvoorbeeld ook te maken met locales (want wanneer weet je dat je met een nederlandse notatie of een amerikaanse notatie te maken hebt).

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Dat sowieso. Met stringwaarden als datum werken is lastig en error prone. Gewoon voor de bewerking even converteren van string naar timestamp en als je klaar bent weer van timestamp naar string. Niemand die het merkt, en intussen werk je 100x makkelijker. ;)

'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

-NMe- schreef op dinsdag 26 juli 2005 @ 16:10:
ivy, mijn code hierboven doet exact hetzelfde in één regel. :P
Klopt, maar ik probeer TS enigzins inzicht te geven in het werken met timestamps - en het feit dat dat helemaal niet omslachtig, moeilijk of server-intensief is. En over code-optimaliseren, dat zit in de praktijk wel goed bij me hoor ;-)

Acties:
  • 0 Henk 'm!

Verwijderd

Je kunt datums overigens wel rechtstreeks met elkaar vergelijken maar dan moet je de Amerikaanse format nemen (yyyy/mm/dd).

2006/01/01 is namelijk wél groter dan 2005/10/02.

Acties:
  • 0 Henk 'm!

  • Gwaihir
  • Registratie: December 2002
  • Niet online
Redenatie goed, benaming niet. Een Amerikaan schrijft dd/mm/yyyy, dus 10/02/2005.

Acties:
  • 0 Henk 'm!

Verwijderd

Birdie schreef op dinsdag 26 juli 2005 @ 23:27:
Redenatie goed, benaming niet. Een Amerikaan schrijft dd/mm/yyyy, dus 10/02/2005.
Volgens mij gebruiken Amerikanen juist de notatie mm/dd/yyyy...

[ Voor 9% gewijzigd door Verwijderd op 26-07-2005 23:41 ]


Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 22:25

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Verwijderd schreef op dinsdag 26 juli 2005 @ 23:41:
[...]


Volgens mij gebruiken Amerikanen juist de notatie mm/dd/yyyy...
Idd, Amerikanen zo en Engelse gewoon dd/mm/yyyy :)

Acties:
  • 0 Henk 'm!

Verwijderd

Klopt, ik schreef het verkeerd, het moet mm/dd/yyyy zijn.

Maar hoe dan ook, TS moet gewoon mktime gebruiken, da's zo'n kleine moeite, 6 letters typen. En je server ligt daar geen moment wakker van, hoor.

Overigens laat ik datums altijd invullen d.m.v. een mooi setje pulldown menu's, want zelf datums laten invullen is niet echt hufterproof. Dan moet je weer allerlei checks maken om te kijken of ze de notatie wel goed hebben.

[ Voor 38% gewijzigd door Verwijderd op 27-07-2005 12:25 ]

Pagina: 1