[PHP] functie datum veranderen

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
ik wil graag een functie maken die van een bepaalde datum de datum berekend van 4 maanden ervoor.
dus een afloopdatum - 4 maanden = vervolgactiedatum

dat is simpel gezegt de bedoeling.

nu heb ik al wel iets simplistisch gemaakt dmv een switch
maar dit is zo belachelijk slecht dat ik deze functie echt niet kan behouden want het is zo fragile als de pest :P

de vraag is dus hoe dit met PHP gemakkelijk op kan worden gelost
op www.php.net kon ik zelf niet echt een leuke functie hiervoor vinden helaas.

het nadeel van mij switch is dus dat het totaal geen rekening houd met dagen zoals 28 en 29 februari
nu wordt het lekker fijn 30 februari als de afloopdatum 30 juni is :9
dit kan dus niet en mag natuurlijk ook niet

naja vooruit hier mijn weirdo functie dan toch maar
dus geen reacties omtrent hoe fout dit kan zijn aub want dat weet ik ook wel :+
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
33
34
35
36
37
38
39
40
41
42
43
44
45
/**
* Functie voor het berekenen van de vervolgactiedatum (4 maanden ervoor)
*@return $vervolgactiedatum.
*/
function vervolgActieDatumBerekenen($afloopdatum)
{
    $afloopdatumarray = explode("-",$afloopdatum);
    $vervolg_datum_dag = $afloopdatumarray[0];
    $vervolg_datum_maand = $afloopdatumarray[1];
    $vervolg_datum_jaar = $afloopdatumarray[2];
    switch (intval($vervolg_datum_maand)) 
    {
        case "01":          $vervolg_datum_maand = "9";
        $vervolg_datum_jaar = intval($vervolg_datum_jaar) - 1;      break;
        case "02":          $vervolg_datum_maand = "10";
        $vervolg_datum_jaar = intval($vervolg_datum_jaar) - 1;      break;
        case "03":          $vervolg_datum_maand = "11";
        $vervolg_datum_jaar = intval($vervolg_datum_jaar) - 1;      break;
        case "04":          $vervolg_datum_maand = "12";
        $vervolg_datum_jaar = intval($vervolg_datum_jaar) - 1;      break;
        case "05":          $vervolg_datum_maand = "01";            break;
        case "06":          $vervolg_datum_maand = "02";            break;
        case "07":          $vervolg_datum_maand = "03";            break;
        case "08":          $vervolg_datum_maand = "04";            break;
        case "09":          $vervolg_datum_maand = "05";            break;
        case "1":           $vervolg_datum_maand = "9";
        $vervolg_datum_jaar = intval($vervolg_datum_jaar) - 1;      break;
        case "2":           $vervolg_datum_maand = "10";
        $vervolg_datum_jaar = intval($vervolg_datum_jaar) - 1;      break;
        case "3":           $vervolg_datum_maand = "11";
        $vervolg_datum_jaar = intval($vervolg_datum_jaar) - 1;      break;
        case "4":           $vervolg_datum_maand = "12";
        $vervolg_datum_jaar = intval($vervolg_datum_jaar) - 1;      break;
        case "5":           $vervolg_datum_maand = "01";            break;
        case "6":           $vervolg_datum_maand = "02";            break;
        case "7":           $vervolg_datum_maand = "03";            break;
        case "8":           $vervolg_datum_maand = "04";            break;
        case "9":           $vervolg_datum_maand = "05";            break;
        case "10":          $vervolg_datum_maand = "06";            break;
        case "11":          $vervolg_datum_maand = "07";            break;
        case "12":          $vervolg_datum_maand = "08";            break;
    }
    $vervolgactiedatum = $vervolg_datum_dag."-".$vervolg_datum_maand."-".$vervolg_datum_jaar;
    return $vervolgactiedatum;
}


p.s. ik moest ff tijdelijk iets hebben om verder te kunnen met het project
en heb het dus zo ff snel opgelost en het werkte "globaal" (februari natuurlijk niet meegerekend)
natuurlijk stond deze functie nog mijn buglist want dit moet natuurlijk beter kunnen >:)

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Acties:
  • 0 Henk 'm!

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 14:51

hamsteg

Species 5618

http://nl3.php.net/date heeft standaard berekeningen als voorbeeld opgenomen. Kijk daar eens naar.

PHP:
1
$last4month = mktime(0, 0, 0, date("m")-4, date("d"),  date("Y"));
De date("m") moet je vervangen voor de afloopdatum en als de gecreeerde maand groter is als de afloopdatum moet je het jaar met 1 verlagen. Iets minder regels code zou ik zeggen.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Zoiets misschien?
En dan gewoon een negatieve interval gebruiken.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

PHP:
1
strtotime("-4 months", $timestamp);

:)

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

  • remcotolsma
  • Registratie: December 2005
  • Laatst online: 28-11-2024
PHP:
1
2
3
$verloopDatum = time();
$date = strtotime('-4 months', time());
echo date('d-m-Y', $date);


Het voorbeeld wat hamsteggot geeft gaat waarschijnlijk wel ietsje sneller...

Acties:
  • 0 Henk 'm!

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
hamsteggot schreef op woensdag 16 augustus 2006 @ 10:49:
http://nl3.php.net/date heeft standaard berekeningen als voorbeeld opgenomen. Kijk daar eens naar.

PHP:
1
$last4month = mktime(0, 0, 0, date("m")-4, date("d"),  date("Y"));
De date("m") moet je vervangen voor de afloopdatum en als de gecreeerde maand groter is als de afloopdatum moet je het jaar met 1 verlagen. Iets minder regels code zou ik zeggen.
hmm ok die had ik denk ik over het hoofd gezien |:( heb weldegelijk daar nog net naar zitten kijken lol
anyway denk wel dat het hiermee zal moeten werken
ik ga ff aan de slag bedankt
RobIII schreef op woensdag 16 augustus 2006 @ 10:51:
Zoiets misschien?
En dan gewoon een negatieve interval gebruiken.
dit lijkt weer beetje op mijn switch verhaal alleen vind ik zelf switch nou niet bepaald de perfecte oplossing voor iets als een datum te veranderen.
nu beter dieperingaand op die code ziet deze daarnaast ook niet bepaald simpel uit :)
tuurlijk kan het maar ik denk dat liever voor mktime() ga :)

[ Voor 4% gewijzigd door Tijgertje84 op 16-08-2006 10:58 ]

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Acties:
  • 0 Henk 'm!

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 14:51

hamsteg

Species 5618

remcotolsma schreef op woensdag 16 augustus 2006 @ 10:54:
Het voorbeeld wat hamsteggot geeft gaat waarschijnlijk wel ietsje sneller...
Thanks maar die van -NME- is het mooist en je hoeft zelf niets meer te corrigeren (was al aan het zoeken maar kon het niet weer vinden).

Acties:
  • 0 Henk 'm!

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
remcotolsma schreef op woensdag 16 augustus 2006 @ 10:54:
PHP:
1
2
3
$verloopDatum = time();
$date = strtotime('-4 months', time());
echo date('d-m-Y', $date);


Het voorbeeld wat hamsteggot geeft gaat waarschijnlijk wel ietsje sneller...
hmm maar deze doet wat ik wil
want bij de andere gaat het toch niet helemaal zoals ik het wil want daar krijg ik resultaten als:
mktime -> 1145138400
-10540784

even mss rekening houden met de datum: 16-8-2006 die 4 maanden terug moet ;)

kortom mijn gelukte oplossing:
PHP:
1
2
3
4
5
6
7
8
9
10
11
/**
* Functie voor het berekenen van de vervolgactiedatum (4 maanden ervoor)
*@return $vervolgactiedatum.
*/
function vervolgActieDatumBerekenen($vervolgactiedatum)
{
    $vervolgactiedatum = time(); 
    $date = strtotime('-4 months', time()); 
    $vervolgactiedatum = date('d-m-Y', $date); 
    return $vervolgactiedatum;
}

[ Voor 25% gewijzigd door Tijgertje84 op 16-08-2006 11:08 ]

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

mktime maakt gewoon hetzelfde type timestamp als strtotime hoor. :)

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

  • remcotolsma
  • Registratie: December 2005
  • Laatst online: 28-11-2024
-NMe- schreef op woensdag 16 augustus 2006 @ 10:54:
PHP:
1
strtotime("-4 months", $timestamp);

:)
Deze blijkt toch ook sneller te gaan als die van hamsteggot..

10000x die van hamsteggot:
3.70420098305 sec.

10000x bovenstaande:
1.68663907051 sec. :P

Acties:
  • 0 Henk 'm!

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
remcotolsma schreef op woensdag 16 augustus 2006 @ 11:08:
[...]

Deze blijkt toch ook sneller te gaan als die van hamsteggot..

10000x die van hamsteggot:
3.70420098305 sec.

10000x bovenstaande:
1.68663907051 sec. :P
hmm hij doet niet wat ik wil lol |:(

hij doet nu de 4 maanden van het huidige datum eraf halen.
bij strtotime kan ik verder geen waarde meegeven van een datum waar hij de actie op moet uitvoeren?

van 30-6-2008 maakt hij 16-04-2006 van wat dus vanaf vandaag berekend wordt..

[ Voor 7% gewijzigd door Tijgertje84 op 16-08-2006 11:18 ]

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Acties:
  • 0 Henk 'm!

Anoniem: 23480

Het tweede argument is de startdatum.

$timestamp moet dus je startdatum zijn in het voorbeeld van Nme

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

Kijk eens wat de functie time() doet en verzin dan eens zelf wat je als tweede parameter moet opgeven voor strtotime. ;)

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

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 15:48
remcotolsma schreef op woensdag 16 augustus 2006 @ 11:08:
[...]

Deze blijkt toch ook sneller te gaan als die van hamsteggot..

10000x die van hamsteggot:
3.70420098305 sec.

10000x bovenstaande:
1.68663907051 sec. :P
10000 x ? Dan zit je wel heel erg in de vroege middeleeuwen ;)

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • 0 Henk 'm!

  • Nielsvr
  • Registratie: Maart 2004
  • Laatst online: 27-05 13:55
Bij de $timestamp kan je een timestamp invullen die je aan kan maken met http://www.php.net/mktime.

Acties:
  • 0 Henk 'm!

Anoniem: 185039

Waarom niet met time() en strftime()

PHP:
1
2
3
4
5
6
7
<?php
$time = time()-3600*24*120; //1 uur x 24 x 120 dagen = +/- 4 maanden
$output = strftime(%d/%m/%y, $time);

print $output;

?>


En voila, de datum/tijd van 4 maanden terug

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

Anoniem: 185039 schreef op woensdag 16 augustus 2006 @ 11:26:
Waarom niet met time() en strftime()

PHP:
1
2
3
4
5
6
7
<?php
$time = time()-3600*24*120; //1 uur x 24 x 120 dagen = +/- 4 maanden
$output = strftime(%d/%m/%y, $time);

print $output;

?>


En voila, de datum/tijd van 4 maanden terug
Leuk met schrikkeljaren, nog los van die syntaxfout. :) Sowieso is het niet bepaald precies he?

[ Voor 7% gewijzigd door NMe op 16-08-2006 11:28 ]

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

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
ag jah bietje prutsen en dan krijg je dit :)

PHP:
1
2
3
4
5
6
7
8
function vervolgActieDatumBerekenen($afloopdatum)
    {
        //getCommonDate($afloopdatum); deze is onnodig zelfs (omzetten van datum)
        $arrayDatum = explode("-",$afloopdatum);
        $date = mktime(0, 0, 0, $arrayDatum[1]-4, $arrayDatum[0], $arrayDatum[2]); 
        $vervolgactiedatum = date('d-m-Y', $date); 
        return $vervolgactiedatum;
    }

en jah het werkt nu wel goed _/-\o_

btw hij maakt dus nu van
30-6-2008 -->> 01-03-2008
lijkt me dus wel goed toch :)

[ Voor 14% gewijzigd door Tijgertje84 op 16-08-2006 11:42 ]

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 15:48
Tijgertje84 schreef op woensdag 16 augustus 2006 @ 11:40:
ag jah bietje prutsen en dan krijg je dit :)

PHP:
1
2
3
4
5
6
7
8
function vervolgActieDatumBerekenen($afloopdatum)
    {
        //getCommonDate($afloopdatum); deze is onnodig zelfs (omzetten van datum)
        $arrayDatum = explode("-",$afloopdatum);
        $date = mktime(0, 0, 0, $arrayDatum[1]-4, $arrayDatum[0], $arrayDatum[2]); 
        $vervolgactiedatum = date('d-m-Y', $date); 
        return $vervolgactiedatum;
    }

en jah het werkt nu wel goed _/-\o_

btw hij maakt dus nu van
30-6-2008 -->> 01-03-2008
lijkt me dus wel goed toch :)
En wat gebeurt er als je je 30-2-2008 invult ?

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

Ook die oplossing is heel leuk fout met schrikkeljaren. :) Nogmaals: neem strtotime.

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

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
StevenK schreef op woensdag 16 augustus 2006 @ 11:46:
[...]

En wat gebeurt er als je je 30-2-2008 invult ?
hehe dat gaat niet :P

want er wordt zodra er deze datum in wordt gevoerd en dan wordt er dmv javascript onchange gecheckt
dit is een functie die dus de datum controleerd zowel met schrikkeljaren etc
je kan wel 29-2-2008 invullen maar geen 29-2-2009 ;)
nee dat heb ik gelukkig goed voormekaar :+
daarnaast worden al deze checks opnieuw uitgevoerd dmv onsubmit van de form ;)

[ Voor 7% gewijzigd door Tijgertje84 op 16-08-2006 11:52 ]

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 15:48
Ik bedoelde ook eigenlijk 'een datum in februari'.

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Tijgertje84 schreef op woensdag 16 augustus 2006 @ 11:51:
[...]

hehe dat gaat niet :P

want er wordt zodra er deze datum in wordt gevoerd en dan wordt er dmv javascript onchange gecheckt
dit is een functie die dus de datum controleerd zowel met schrikkeljaren etc
je kan wel 29-2-2008 invullen maar geen 29-2-2009 ;)
nee dat heb ik gelukkig goed voormekaar :+
Een javascript check noem je "goed voormekaar"? ;)
Niet lullig bedoeld hoor, maar user-input hoor je server-side te checken, niet client-side (hoewel dat wel een leuk "hulpstuk" kan zijn. Het is erg easy om die js-check van je te omzeilen en alsnog 29-2-2008 door te sturen naar je servert ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
StevenK schreef op woensdag 16 augustus 2006 @ 11:59:
[...]

Ik bedoelde ook eigenlijk 'een datum in februari'.
16-2-2007 -->> 16-10-2006 :)

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Acties:
  • 0 Henk 'm!

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
RobIII schreef op woensdag 16 augustus 2006 @ 12:14:
[...]

Een javascript check noem je "goed voormekaar"? ;)
Niet lullig bedoeld hoor, maar user-input hoor je server-side te checken, niet client-side (hoewel dat wel een leuk "hulpstuk" kan zijn. Het is erg easy om die js-check van je te omzeilen en alsnog 29-2-2008 door te sturen naar je servert ;)
hoe dan? want ik heb deze check namelijk niet in PHP anders kan ik hem daar ook nog altijd doorheenhalen natuurlijk als ik hem vind
maar is het dan echt zo slecht dan?
het is wel idd een "hulpstuk" voor degene die het invoert want zo voorkom je grotendeels foutieve invoer door men op het juiste been te zetten.

btw ik meen dat je bedoelt 29-2-2009 want 29-2-2008 is een geldige datum ;)

checkdate() :) zal die wel gebruiken dan als extra

[ Voor 8% gewijzigd door Tijgertje84 op 16-08-2006 12:24 ]

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

Tijgertje84 schreef op woensdag 16 augustus 2006 @ 12:19:
hoe dan? want ik heb deze check namelijk niet in PHP anders kan ik hem daar ook nog altijd doorheenhalen natuurlijk als ik hem vind
Javascript uitzetten. :Y)

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

Pagina: 1