[PHP] een datum x + y maand(en)

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

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
zoals in de titel beschreven.

ik vraag me af hoe ik een maand bij een bepaalde datum toevoeg zonder problemen te krijgen met de jaartelling.
dus stel, ik heb een datum 2007-12-5 en hierbij 2 maanden wil toevoegen.
dan zou ik zoiets als dit krijgen:
PHP:
1
2
3
4
5
6
7
<?php
    $kalendery = date("Y", strtotime($datum['kalenderdatum']));
    $kalenderm = date("m", strtotime($datum['kalenderdatum'])) + $extramaand;
    $kalenderd = date("d", strtotime($datum['kalenderdatum']));
    
    $kalender =  mktime(0,0,0, $kalenderm, $kalenderd, $kalendery);
?>


dan krijg ik in dit geval 2007-2-5, hij verwerkt de maand wel goed maar laat het jaar zitten.
iemand met een goed idee?

Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • MaximusTG
  • Registratie: April 2003
  • Niet online
(overleden)
Ben geen phpprogrammeur, maar is dit niet een gewoon zo van:

uitgangsituatie:

kalenderjaar = 2007

kalendermaand = 8

kalenderdag = 7

stel extra maanden = 5

if kalendermaand > 12
kalenderjaar = kalenderjaar +1
kalendermaand = kalendermaand - 12


dan wordt jaar dus 2008, en maand 8+5-12 = 1

of denk ik dan te simpel?

[ Voor 12% gewijzigd door MaximusTG op 12-11-2007 16:25 ]

Zin in pizza? Probeer 'mijn' pizzarecept eens! Laatste versie pizzarecept Blog:KookKompas


Acties:
  • 0 Henk 'm!

Verwijderd

strtotime kan dat voor je, lees de manual page maar even door.

http://nl.php.net/strtotime

Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 12:37

Gonadan

Admin Beeld & Geluid, Harde Waren
PHP:
1
strtotime('+2 months', strtotime($datum['kalenderdatum']));

ofzo?

[ Voor 25% gewijzigd door Gonadan op 12-11-2007 16:27 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 18-09 12:47

killercow

eth0

Gewoon de huidige datetime pakken, + 2x30.5x24x60x60 seconden er bij optellen, en dan van die datetime weer de datum pakken.

(of gewoon mysql dit voor je laten uitzoeken (dat_add, of date_sub icm interval Month)

openkat.nl al gezien?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok thanks :D heb het voor elkaar, voortaan verder lezen dan mijn neus lang is :p

Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
killercow schreef op maandag 12 november 2007 @ 16:29:
Gewoon de huidige datetime pakken, + 2x30.5x24x60x60 seconden er bij optellen, en dan van die datetime weer de datum pakken.
Doe dat eind januari, en je komt uit in april. Niet helemaal de bedoeling lijkt me.

Acties:
  • 0 Henk 'm!

  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 27-06 13:00
killercow schreef op maandag 12 november 2007 @ 16:29:
(of gewoon mysql dit voor je laten uitzoeken (dat_add, of date_sub icm interval Month)
Je doet je ondertitel wel eer aan ;)

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Die is vooral lullig als je via jouw methode een maand op wil tellen bij 31 januari. ;) Daarnaast maakt het bestaan van het schrikkeljaar (en als het heel precies moet zelfs schikkelseconden) het vervelend om het zaakje in jouw methode met een simpele if-constructie af te vangen. Nouja, tenzij je checkdate() gebruikt. :P

[ Voor 39% gewijzigd door NMe op 12-11-2007 17:59 ]

'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

Wat gonadan zegt, dat is inderdaad de beste manier. Google anders even op GNU time of iets dergelijks, dan kan je zien hoe je met strtotime makkelijk zulke problemen oplost.

Acties:
  • 0 Henk 'm!

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 06-09 22:19
Poepsimpel als je met unix timestamps zou werken. Zet je datum om in een unixtimestamp, tel daarbij de tijd die dat erbij moet, wel omgerekend in seconden en huppa, klaar is kees

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600


Acties:
  • 0 Henk 'm!

Verwijderd

imp4ct schreef op maandag 12 november 2007 @ 21:09:
Poepsimpel als je met unix timestamps zou werken. Zet je datum om in een unixtimestamp, tel daarbij de tijd die dat erbij moet, wel omgerekend in seconden en huppa, klaar is kees
OK vertel jij mij hoeveel secondes er in 2 maanden zitten?

Acties:
  • 0 Henk 'm!

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 06-09 22:19
Verwijderd schreef op maandag 12 november 2007 @ 21:20:
[...]

OK vertel jij mij hoeveel secondes er in 2 maanden zitten?
Je moet gewoon weten welke maanden het zijn die je moet optellen en of de maanden die je in dat jaar erbij telt een maand in een schrikkeljaar vallen ja of nee.

Een je weet welke maand(en) en of het jaar "leap" is of niet is het een fluitje van een cent.

1 dag in seconden = 3600 * 24

Als je het nu nog niet weet ... ga'k me vragen stellen bij je hoofdrekenen.

Allé .. hier een script om je datum om te zetten naar een unixtimestamp

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//dd-mm-yyyy
  //script that get's a timestamp from a forwarded date
  //this script can be used also for dates before 1970
  function print_unixtimestamp_ddmmyyyy($date)
  {
    if(!empty($date))
    {
        $day = substr($date,0,2);
      $month = substr($date,3,2);
      $year = substr($date,6,4);
      $hour = 21;
      $minute = 59;
      $second = 59;
      
      if ( $year > 1969 )
      {
        return(gmmktime($hour,$minute,$second,$month,$day,$year));
      }
  
      $t = 0;
      $ds = 86400;
      $hs = 3600;
      $dy = 365;
      $ms = 60;
  
      $months = array ( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
      $leap_year = $year % 4 == 0 && ( $year % 100 > 0 || $year % 400 == 0 ) ? true : false;
  
      if ( $year < 1969 )
      {
        $y = 1969 - $year;
        $t -= ( $y * $dy ) * $ds;
        $x = ceil ( $y / 4 );
  
        if ( $leap_year && $month > 2 )
        {
          $x -= 1;
        }
  
        $t -= $x * $ds;
      }
  
      if ( $month != 12 )
      {
        $tm = $months;
        $tm = array_slice ($tm,$month);
        $t -= array_sum ($tm) * $ds;
        unset($tm);
      }
  
      $nh = (($month == 2 && $leap_year ? 29 : $months[$month-1] ) - $day);
      $t -= $nh != 0 ? $nh * $ds : 0;
      $nh = 23 - $hour;
      $t -= $nh != 0 ? $nh * $hs : 0;
      $nh = 59 - $minute;
      $t -= $nh != 0 ? $nh * $ms : 0;
      $nh = 59 - $second;
      $t -= $nh != 0 ? $nh + 1 : 0;
      
      return($t);
    }
  }

[ Voor 59% gewijzigd door imp4ct op 12-11-2007 21:30 ]

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600


Acties:
  • 0 Henk 'm!

  • Deikke
  • Registratie: Juni 2004
  • Laatst online: 06:44
strtotime ("+2 months", time()); zal de datum over 2 maanden geven, ik denk dat je hiermee het probleem wel kan oplossen.

Acties:
  • 0 Henk 'm!

Verwijderd

imp4ct schreef op maandag 12 november 2007 @ 21:25:
[...]
Je moet gewoon weten welke maanden het zijn die je moet optellen en of de maanden die je in dat jaar erbij telt een maand in een schrikkeljaar vallen ja of nee.
En dan ook nog eens rekening houden met schrikkelsecondes en wie weet wat nog meer, nee strtotime is een stukje eenvoudiger daar zit dat allemaal al in en kun je ook bijna ieder textuele datum omzetten naar een Unix timestamp.

(Er zitten dus helemaal niet 24x3600 sec in een dag, soms 1 meer en soms 1 minder, mijn vraag was dus even om je een duwtje in de goede richting te geven namelijk dat er niet een vast aantal secondes in een maand zitten en je dus niet heel simpel even het aantal secondes voor 2 maanden erbij kunt tellen.)

Waarom moeilijk doen als het makkelijk kan?
Deikke schreef op maandag 12 november 2007 @ 21:32:
strtotime ("+2 months", time()); zal de datum over 2 maanden geven, ik denk dat je hiermee het probleem wel kan oplossen.
Is pas 3x gezegd :)

[ Voor 34% gewijzigd door Verwijderd op 12-11-2007 21:52 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

imp4ct schreef op maandag 12 november 2007 @ 21:09:
Poepsimpel als je met unix timestamps zou werken. Zet je datum om in een unixtimestamp, tel daarbij de tijd die dat erbij moet, wel omgerekend in seconden en huppa, klaar is kees
Dat is inderdaad vééél simpeler dan één enkele functieaanroep. 8)7

'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