Toon posts:

[PHP] Heel vreemd datum probleem. van Okt+ 1 maand = Dec??

Pagina: 1
Acties:

Onderwerpen


  • popolskuprosze
  • Registratie: augustus 2010
  • Laatst online: 27-04-2011
Goedenavond,

Ik zit met iets voor mijn gevoel bijzonder vaags.
Ik heb hier een calender scriptje.
Heb ik een hele tijd geleden ergens vandaan gehaald en zelf aangepast naar mijn eigen wensen.

Het werkte eigenlijk perfect.
Tot vanavond.

Zodra ik op Oktober zit en klik op naar de volgende maand gaan.
Dan schiet ie in één keer door naar December. En van December naar Januari. Van Januari naar Maart.
Maar er zit simpelweg een tellertje in. Vorige maand + 1;
Dus 2 maanden verder geeft geen logica.

Zodra ik mijn systeemklok een dag vooruit zet.
(dus op 1 November 2010) werkt alles weer zoals het had moeten werken.


Dus alleen als de datum Oktober 2010 is. Dan snapt hij het niet meer.
Ik heb bijna het vermoeden dat dit een bug is met PHP. Maarja hoe of wat?

Ziet één van jullie misschien het probleem?

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
<?php
echo    "            <table class=\"kalender\">\n";
echo    "               <tr>\n";
echo    "                   <td class=\"kalalg\">\n";

///######## VARIABEL BEPALDENDE DE MAAND OPHALEN
if(isset($_POST['dwaarde'])){
    $datumwaarde = $_POST['dwaarde'];
}
else{
    $datumwaarde = 0;
}


///######## ZODRA DE NAVIGATIE KNOPPEN WORDEN GEBRUIKT
if(isset($_POST['vorige'])){
    ///######### DE DATUMTELLER OPHOGEN
    $datumwaarde--;
    
    ///######### DE HUIDIGE DATUM BEPALEN
    $nu = mktime(0, 0, 0, date("m")+$datumwaarde, date("d"), date("Y"));
}
elseif(isset($_POST['volgende'])){
    ///######### DE DATUMTELLER OPHOGEN
    $datumwaarde++;
    
    ///######### DE HUIDIGE DATUM BEPALEN
    $nu = mktime(0, 0, 0, date("m")+$datumwaarde, date("d"), date("Y"));
}
else{
    ///######### DE HUIDIGE DATUM BEPALEN
    $nu = mktime(0, 0, 0, date("m"), date("d"), date("Y"));
}

/* Start weergave berekeningsdeel */
$this_month = date("n",$nu);
if($this_month == 0){
    $this_month = 12;
}
$month_name = date("F",$nu);
$this_year = date("Y",$nu);


///######### ZODRA ER EEN ALTERNATIEVE MAAND GEGEVEN MOET WORDEN
if(empty($selectedmaand)){
    $selectedmaand = date("n",$nu);
}
else{
    $this_month = $selectedmaand;
}

///######## HET NAVIGATIE GEDEELTE
$last_month = $this_month - 1;
$next_month = $this_month + 1;

echo "deze maand: $this_month";

///######## BEVEILPIGING TEGEN MOGELIJKE FOUTEN
if($last_month == 12){
    $last_year = $this_year - 1;
}
else{
    $last_year = $this_year;
}
if($next_month == 1){
    $next_year = $this_year + 1;
}
else {
    $next_year = $this_year;
}

///######## DE HOOFDTITELS PARSEN
echo    "                       <table class=\"kalendersub\">\n";
echo    "                           <tr>\n";
echo    "                               <td class=\"kalalg\">\n";
echo    "                                   <form action=\"\" method=\"post\">  <input type=\"hidden\" value=\"".$datumwaarde."\" name=\"dwaarde\" /><input name=\"vorige\" type=\"submit\" value=\"&lt;&lt; Vorige maand\" /> &nbsp; <input name=\"volgende\" type=\"submit\" value=\"Volgende maand &gt;&gt;\" /><input name=\"maand\" value=\"".$selectedmaand."\" type=\"hidden\" /></form><center>".$month_name." ".$this_year."</center>\n";
echo    "                               </td>\n";
echo    "                           </tr>\n";
echo    "                       </table>\n";

///######## DE KALENDERTITELS PARSEN
echo    "                       <table class=\"truekal\">\n";
echo    "                           <tr>\n";
echo    "                               <td class=\"kaltit\"> </td>\n";
echo    "                               <td class=\"kaltit\">Zo</td>\n";
echo    "                               <td class=\"kaltit\">Ma</td>\n";
echo    "                               <td class=\"kaltit\">Di</td>\n";
echo    "                               <td class=\"kaltit\">Wo</td>\n";
echo    "                               <td class=\"kaltit\">Do</td>\n";
echo    "                               <td class=\"kaltit\">Vr</td>\n";
echo    "                               <td class=\"kaltit\">Za</td>\n";
echo    "                           </tr>\n";

    ///######## HET TEKENEN VAN TEVOREN BEREKENEN
    $first_day = date("w", mktime(0, 0, 0, $this_month, 1, $this_year));
    $total_days = date("t", mktime(0, 0, 0, $this_month, 1, $this_year));
    $week_num = 1;
    $day_num = 1;
    $the_day = " ";

///######## HET AANTAL WEKEN DAT IN DE MAAND ZIT DOORLOPEN (VOORNAMELIJKE TELLER)
while($week_num <= 6){
    $deweek = 0;
    echo    "                           <tr>\n";
    
    ///######## ZODRA DE DAG -1 BOVEN DE 0 ZIT
    if(($the_day-1)>0){
        if($the_day>$total_days){
            echo    "                               <td class=\"kaltit\"> </td>\n";
        } 
        else{
            $deweek = date("W",mktime(0,0,0,$this_month,$the_day+2,$this_year));
            echo    "                               <td class=\"kaltit\">".$deweek."</td>\n";
        }
    } 
    else{
        $deweekl = date("W",mktime(0,0,0,$this_month,1,$this_year));
        ///######## ZODRA DE WEEK NOG MOET BEGINNEN
        if(!isset($gezet)){        
            echo    "                               <td class=\"kaltit\">".$deweekl."</td>\n";
        }
        else{
            echo    "                               <td class=\"kaltit\">&nbsp;</td>\n";
        }
        $gezet = "ja";
    }
    
    /* Loop door de weekdagen */
    for( $i = 0; $i <= 6; $i++ ){
        if($week_num == 1){
            if ($i < $first_day){
                $the_day = " ";
            }
            elseif($i == $first_day){
                $the_day = 1;
            }
        }
        else{
            if($the_day > $total_days){
                $the_day = " ";
            }
        }
        

        
        ///######## KIJKEN OF ER OOK ECHT EEN DAG IS OM HET AANTAL AUTO'S VOOR UIT TE LEZEN        
        if(($the_day != "") && ($the_day) && ($the_day != " ")){
            $cvar1 = date("Y-m-d",mktime(0,0,0,$this_month,$the_day+0,$this_year));
            $cvar2 = date("Y-m-d",mktime(0,0,0,$this_month,$the_day+0,$this_year)); 
            
            $plaatsteller = "";
            $aankomstteller = "";
            $vertrekteller = "";

        }
        ///######## ZODRA ER GEEN DAG IS GEWOON EEN LEGE TELLER WEERGEVEN
        else{
            $plaatsteller = "";
            $aankomstteller = "";
        }
        
        $cvar2 = "";
        
        ///######## WEEKDAG WEERGEVEN
        if($the_day){
            echo   "                               <td class=\"kaltexr\" onclick=\"FP_openNewWindow('1300', '1200', false, false, false, false, false, false, 'dagindeling', /*href*/'dagindeling.php?dag=".$cvar2."')\">".$the_day."<br />";
        }
        else{
            echo   "                               <td class=\"kaltexr\">".$the_day."<br />";
        }        
        if($plaatsteller != ""){
            echo    " <span class=\"vinf\">Voertuigen: ".$plaatsteller."</span><br /><span class=\"ariv\">Nieuw: <b>".$aankomsteller."</b></span><br /><span class=\"ariv\">Vertrek: <b>".$vertrekteller."</b></td>\n";
        }
        else{
            echo    " ".$plaatsteller."</td>\n";
        }
        ///######## DE DAG OPHOGEN (VOLGENDE WEEKDAG)
        if($the_day != " "){
            $the_day++;
        }
    }
    
    /* Volgende week doorlopen */
    echo    "                           </tr>\n";
    
    $week_num++;
}

///######### ALLE TAGS AFSLUITEn
echo    "                       </table>\n";
echo    "                   </td>\n";
echo    "               </tr>\n";
echo    "           </table>\n";
?>


Want dit is wel bizar vreemd.





OPGELOST!!!!!!!!!!!!!!!!!!!!!!!!!

WERKENDE VERSIE!


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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
<?php
echo    "            <table class=\"kalender\">\n";
echo    "               <tr>\n";
echo    "                   <td class=\"kalalg\">\n";

///######## VARIABEL BEPALDENDE DE MAAND OPHALEN
if(isset($_POST['dwaarde'])){
    $datumwaarde = $_POST['dwaarde'];
}
else{
    $datumwaarde = 0;
}


///######## ZODRA DE NAVIGATIE KNOPPEN WORDEN GEBRUIKT
if(isset($_POST['vorige'])){
    ///######### DE DATUMTELLER OPHOGEN
    $datumwaarde--;
    
    ///######### DE HUIDIGE DATUM BEPALEN
    $nu = mktime(0, 0, 0, date("m")+$datumwaarde, 1, date("Y"));
}
elseif(isset($_POST['volgende'])){
    ///######### DE DATUMTELLER OPHOGEN
    $datumwaarde++;
    
    ///######### DE HUIDIGE DATUM BEPALEN
    $nu = mktime(0, 0, 0, date("m")+$datumwaarde, 1, date("Y"));
}
else{
    ///######### DE HUIDIGE DATUM BEPALEN
    $nu = mktime(0, 0, 0, date("m"), date("d"), date("Y"));
}

/* Start weergave berekeningsdeel */
$this_month = date("n",$nu);
if($this_month == 0){
    $this_month = 12;
}
$month_name = date("F",$nu);
$this_year = date("Y",$nu);


///######### ZODRA ER EEN ALTERNATIEVE MAAND GEGEVEN MOET WORDEN
if(empty($selectedmaand)){
    $selectedmaand = date("n",$nu);
}
else{
    $this_month = $selectedmaand;
}

///######## HET NAVIGATIE GEDEELTE
$last_month = $this_month - 1;
$next_month = $this_month + 1;

echo "deze maand: $this_month";

///######## BEVEILPIGING TEGEN MOGELIJKE FOUTEN
if($last_month == 12){
    $last_year = $this_year - 1;
}
else{
    $last_year = $this_year;
}
if($next_month == 1){
    $next_year = $this_year + 1;
}
else {
    $next_year = $this_year;
}

///######## DE HOOFDTITELS PARSEN
echo    "                       <table class=\"kalendersub\">\n";
echo    "                           <tr>\n";
echo    "                               <td class=\"kalalg\">\n";
echo    "                                   <form action=\"\" method=\"post\">  <input type=\"hidden\" value=\"".$datumwaarde."\" name=\"dwaarde\" /><input name=\"vorige\" type=\"submit\" value=\"&lt;&lt; Vorige maand\" /> &nbsp; <input name=\"volgende\" type=\"submit\" value=\"Volgende maand &gt;&gt;\" /><input name=\"maand\" value=\"".$selectedmaand."\" type=\"hidden\" /></form><center>".$month_name." ".$this_year."</center>\n";
echo    "                               </td>\n";
echo    "                           </tr>\n";
echo    "                       </table>\n";

///######## DE KALENDERTITELS PARSEN
echo    "                       <table class=\"truekal\">\n";
echo    "                           <tr>\n";
echo    "                               <td class=\"kaltit\"> </td>\n";
echo    "                               <td class=\"kaltit\">Zo</td>\n";
echo    "                               <td class=\"kaltit\">Ma</td>\n";
echo    "                               <td class=\"kaltit\">Di</td>\n";
echo    "                               <td class=\"kaltit\">Wo</td>\n";
echo    "                               <td class=\"kaltit\">Do</td>\n";
echo    "                               <td class=\"kaltit\">Vr</td>\n";
echo    "                               <td class=\"kaltit\">Za</td>\n";
echo    "                           </tr>\n";

    ///######## HET TEKENEN VAN TEVOREN BEREKENEN
    $first_day = date("w", mktime(0, 0, 0, $this_month, 1, $this_year));
    $total_days = date("t", mktime(0, 0, 0, $this_month, 1, $this_year));
    $week_num = 1;
    $day_num = 1;
    $the_day = " ";

///######## HET AANTAL WEKEN DAT IN DE MAAND ZIT DOORLOPEN (VOORNAMELIJKE TELLER)
while($week_num <= 6){
    $deweek = 0;
    echo    "                           <tr>\n";
    
    ///######## ZODRA DE DAG -1 BOVEN DE 0 ZIT
    if(($the_day-1)>0){
        if($the_day>$total_days){
            echo    "                               <td class=\"kaltit\"> </td>\n";
        } 
        else{
            $deweek = date("W",mktime(0,0,0,$this_month,$the_day+2,$this_year));
            echo    "                               <td class=\"kaltit\">".$deweek."</td>\n";
        }
    } 
    else{
        $deweekl = date("W",mktime(0,0,0,$this_month,1,$this_year));
        ///######## ZODRA DE WEEK NOG MOET BEGINNEN
        if(!isset($gezet)){        
            echo    "                               <td class=\"kaltit\">".$deweekl."</td>\n";
        }
        else{
            echo    "                               <td class=\"kaltit\">&nbsp;</td>\n";
        }
        $gezet = "ja";
    }
    
    /* Loop door de weekdagen */
    for( $i = 0; $i <= 6; $i++ ){
        if($week_num == 1){
            if ($i < $first_day){
                $the_day = " ";
            }
            elseif($i == $first_day){
                $the_day = 1;
            }
        }
        else{
            if($the_day > $total_days){
                $the_day = " ";
            }
        }
        

        
        ///######## KIJKEN OF ER OOK ECHT EEN DAG IS OM HET AANTAL AUTO'S VOOR UIT TE LEZEN        
        if(($the_day != "") && ($the_day) && ($the_day != " ")){
            $cvar1 = date("Y-m-d",mktime(0,0,0,$this_month,$the_day+0,$this_year));
            $cvar2 = date("Y-m-d",mktime(0,0,0,$this_month,$the_day+0,$this_year)); 
            
            $plaatsteller = "";
            $aankomstteller = "";
            $vertrekteller = "";

        }
        ///######## ZODRA ER GEEN DAG IS GEWOON EEN LEGE TELLER WEERGEVEN
        else{
            $plaatsteller = "";
            $aankomstteller = "";
        }
        
        $cvar2 = "";
        
        ///######## WEEKDAG WEERGEVEN
        if($the_day){
            echo   "                               <td class=\"kaltexr\" onclick=\"FP_openNewWindow('1300', '1200', false, false, false, false, false, false, 'dagindeling', /*href*/'dagindeling.php?dag=".$cvar2."')\">".$the_day."<br />";
        }
        else{
            echo   "                               <td class=\"kaltexr\">".$the_day."<br />";
        }        
        if($plaatsteller != ""){
            echo    " <span class=\"vinf\">Voertuigen: ".$plaatsteller."</span><br /><span class=\"ariv\">Nieuw: <b>".$aankomsteller."</b></span><br /><span class=\"ariv\">Vertrek: <b>".$vertrekteller."</b></td>\n";
        }
        else{
            echo    " ".$plaatsteller."</td>\n";
        }
        ///######## DE DAG OPHOGEN (VOLGENDE WEEKDAG)
        if($the_day != " "){
            $the_day++;
        }
    }
    
    /* Volgende week doorlopen */
    echo    "                           </tr>\n";
    
    $week_num++;
}

///######### ALLE TAGS AFSLUITEn
echo    "                       </table>\n";
echo    "                   </td>\n";
echo    "               </tr>\n";
echo    "           </table>\n";
?>

[Voor 47% gewijzigd door popolskuprosze op 31-10-2010 21:18]

Po prostu Polak w Holandii


  • deathgrunt
  • Registratie: maart 2009
  • Niet online
Wintertijd / Zomertijd 2010?

Of gewoon slecht geprogrammeerd, dat men telt van 0 tot 9 - en dus bij maand nummer 10 er uit schiet?

[Voor 65% gewijzigd door deathgrunt op 31-10-2010 21:09]


  • Nightspirit
  • Registratie: augustus 2001
  • Laatst online: 28-06-2014
De overgeslagen maanden hebben geen 31e (viel me op)

  • Tribledragon
  • Registratie: augustus 2009
  • Laatst online: 13-09 20:01
Ik ben niet bekend met programmeren, maar je hebt het over van oktober naar december en van januari naar maart ... februari en november zijn beide 2 maanden met minder als 31 dagen... zou het hier mee te maken kunnen hebben ?

Samsung R710 Q9000 geforce 130m


  • popolskuprosze
  • Registratie: augustus 2010
  • Laatst online: 27-04-2011
Tribledragon schreef op zondag 31 oktober 2010 @ 20:59:
Ik ben niet bekend met programmeren, maar je hebt het over van oktober naar december en van januari naar maart ... februari en november zijn beide 2 maanden met minder als 31 dagen... zou het hier mee te maken kunnen hebben ?
Ja daar heb je gelijk in. Maar het aller vreemdste probleem is dat het probleem alleen voorkomt als je in Oktober zit.

Dus zodra je buiten Oktober zit doet het probleem zich niet meer voor.
En gaat hij gewoon van maand 1 naar maand 2 en van maand 2 naar maand 3 enzovoort.

Vandaar dat ik gewoon niet zie waar mijn fout zit.
In andere woorden: hij doet het toch??? Maar toch ook weer niet

Po prostu Polak w Holandii


  • Nightspirit
  • Registratie: augustus 2001
  • Laatst online: 28-06-2014
Omdat 31 November niet bestaat. Dit probleem doet zich op elke 31e voor waar de volgende maand geen 31 dagen heeft, het viel je alleen niet eerder op.

  • popolskuprosze
  • Registratie: augustus 2010
  • Laatst online: 27-04-2011
NiGhTsPiRiT schreef op zondag 31 oktober 2010 @ 21:04:
Omdat 31 November niet bestaat. Dit probleem doet zich op elke 31e voor waar de volgende maand geen 31 dagen heeft, het viel je alleen niet eerder op.
Verrek!! Je hebt gelijk!!

Admin sluit deze alsjeblieft niet.
Ik wil de opgeloste / werkende versie posten.

Po prostu Polak w Holandii


  • NederB
  • Registratie: augustus 2005
  • Laatst online: 07-09 18:59
Dit snap ik uberhaupt niet, je zegt "huidige datum + volgende maand"
PHP:
1
$nu = mktime(0, 0, 0, date("m")+$datumwaarde, date("d"), date("Y"));


Dus het is januari 2010, $datumwaarde wordt dan 2.
$nu is dan januari + 2 = maart, of lees ik het nou verkeerd?

edit: volgens mij lees ik jou script verkeerd

[Voor 10% gewijzigd door NederB op 31-10-2010 21:15]


  • popolskuprosze
  • Registratie: augustus 2010
  • Laatst online: 27-04-2011
NederB schreef op zondag 31 oktober 2010 @ 21:10:
Dit snap ik uberhaupt niet, je zegt "huidige datum + volgende maand"
PHP:
1
$nu = mktime(0, 0, 0, date("m")+$datumwaarde, date("d"), date("Y"));


Dus het is januari 2010, $datumwaarde wordt dan 2.
$nu is dan januari + 2 = maart, of lees ik het nou verkeerd?

edit: volgens mij lees ik jou script verkeerd
Je las het idd verkeerd.
Maar je hebt me wel geholpen met het oplossen!!!!!!

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
///######## ZODRA DE NAVIGATIE KNOPPEN WORDEN GEBRUIKT
if(isset($_POST['vorige'])){
    ///######### DE DATUMTELLER OPHOGEN
    $datumwaarde--;
    
    ///######### DE HUIDIGE DATUM BEPALEN
    $nu = mktime(0, 0, 0, date("m")+$datumwaarde, 1, date("Y"));
}
elseif(isset($_POST['volgende'])){
    ///######### DE DATUMTELLER OPHOGEN
    $datumwaarde++;
    
    ///######### DE HUIDIGE DATUM BEPALEN
    $nu = mktime(0, 0, 0, date("m")+$datumwaarde, 1, date("Y"));
}


HET WERKT!!

IDD 31 oktober 2010 + 31 dagen = 31 november 2010!
Nu ik het aangeef gewoon naar de eerste van de maand te gaan werkt het! :D

_/-\o_ _/-\o_ _/-\o_ _/-\o_ _/-\o_

BEDANKT!!!!!!!!!!

Po prostu Polak w Holandii


  • Nightspirit
  • Registratie: augustus 2001
  • Laatst online: 28-06-2014
Gaat ie nu niet proberen van maand 12 naar maand 13 te gaan? Of vorige... van maand 1 naar maand 0?

[Voor 26% gewijzigd door Nightspirit op 31-10-2010 21:29. Reden: Ik moet leren typen]


  • Tribledragon
  • Registratie: augustus 2009
  • Laatst online: 13-09 20:01
Even een andere vraag. Hou je rekening met een schrikkeljaar?
Regels voor schrikkeljaren:
deelbaar door 4 -> Schrikkeljaar
--> uitzondering hierop deelbaar door 100 geen schrikkeljaar
------> Uitzonder daar weer op deelbaar door 400 weer wel schrikkeljaar

(regels volgens gregoriaanse kalender)

Samsung R710 Q9000 geforce 130m


  • cariolive23
  • Registratie: januari 2007
  • Laatst online: 03-06 14:52
Waarom gebruik je niet de DateTime-class van PHP? Sinds versie 5.2 is deze beschikbaar en kan dankij modify prima rekenen met datums en tijden.

  • ACM
  • Registratie: januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

NiGhTsPiRiT schreef op zondag 31 oktober 2010 @ 21:27:
Gaat ie nu niet proberen van maand 12 naar maand 13 te gaan? Of vorige... van maand 1 naar maand 0?
Dat regelt mktime zelf wel. Heel netjes is het natuurlijk niet om de 0e of zelfs -10e maand te gebruiken, maar het zal op zich prima werken.
Tribledragon schreef op zondag 31 oktober 2010 @ 22:00:
Even een andere vraag. Hou je rekening met een schrikkeljaar?
Als je gewoon met de eerste van de maand, ipv 'dag van vandaag' werkt, dan boeit dat helemaal niet. En dat moest ie toch al om zijn originele probleem met maanden die wel of niet 31 dagen hebben op te lossen. In zijn geval ging hij namelijk naar 31 november en kwam daarmee (door bovenstaande overflow-terugrekening) op 1 december uit.
cariolive23 schreef op zondag 31 oktober 2010 @ 22:10:
Waarom gebruik je niet de DateTime-class van PHP? Sinds versie 5.2 is deze beschikbaar en kan dankij modify prima rekenen met datums en tijden.
't Is inderdaad correcter om dat te gebruiken. Kans is groot dat de diverse voorbeelden en stukken documentatie die her en der te vinden zijn het niet gebruiken. Wat dat betreft is het jammer dat er zoveel van dat soort dingen pas heel laat in php geintroduceerd zijn, waardoor niemand ze eigenlijk leert kennen.

Saai uitzicht in je tuin? Hang er een foto voor!


  • Lone Gunman
  • Registratie: juni 1999
  • Niet online
De DateTime class heeft precies hetzelfde "probleem". Sterker nog, eigenlijk elke library die het toe laat te rekenen met maanden of jaren kent dit probleem. En eigenlijk maakt het niet zoveel uit hoe een library het implementeert, zolang het maar duidelijk gedocumenteerd is.

Het probleem is hier dat een maand geen vast aantal dagen heeft (kan 28, 29, 30, 31 zijn).
Vandaag is het 31 oktober, als ik nu vraag wat de datum over exact een maand is... wat bedoel ik dan?
Misschien bedoel ik de laatste dag van de volgende maand, omdat 31 oktober de laatste dag van de huidige maand is. Maar dan kom ik in de knoop met bv 30 januari 2011 (een na laatste dag van januari). Wat is dan exact een maand na die datum?

mktime en DateTime lossen het op door er eerst een maand bij te tellen en er dan weer chocola van te maken. Dus 31-10-2010 + 1 maand = 31-11-2010 -> is niet geldig, laatste geldige dag is 30-11-2010 -> verschil optellen -> 1-12-2010.

Dus zodra je gebruik maakt van date time functies of een library die rekenen met maanden en jaren toestaat, altijd even controleren hoe dit geimplementeerd is en daar dan rekening mee houden.

Experience has taught me that interest begets expectation, and expectation begets disappointment, so the key to avoiding disappointment is to avoid interest.


  • NMe
  • Registratie: februari 2004
  • Nu online

NMe

Quia Ego Sic Dico.

PHP:
1
2
echo date('Y-m-d H:i:s').'<br>';
echo date('Y-m-d H:i:s', strtotime('+1 month'));


2010-10-31 23:10:09
2010-12-01 23:10:09

Lijkt me volledig logisch én gewenst gedrag?

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


  • Nightspirit
  • Registratie: augustus 2001
  • Laatst online: 28-06-2014
NMe schreef op zondag 31 oktober 2010 @ 23:10:
PHP:
1
2
echo date('Y-m-d H:i:s').'<br>';
echo date('Y-m-d H:i:s', strtotime('+1 month'));


2010-10-31 23:10:09
2010-12-01 23:10:09

Lijkt me volledig logisch én gewenst gedrag?
Logisch: ja. Gewenst (in dit geval) niet.

  • Soultaker
  • Registratie: september 2000
  • Laatst online: 22-07 23:43
Wat was hier dan gewenst gedrag geweest? Want 30 november lijkt me ook niet echt gewenst gedrag of wel?

  • Gomez12
  • Registratie: maart 2001
  • Laatst online: 23-07 14:44
Soultaker schreef op maandag 01 november 2010 @ 00:15:
Wat was hier dan gewenst gedrag geweest? Want 30 november lijkt me ook niet echt gewenst gedrag of wel?
Gewenst gedrag was een correctere omschrijving van de gevraagde waarde...

Volgende maand is gewoon niet gedefinieerd als iets.
Wat de meeste mensen ( en waarschijnlijk ook TS ) bedoelen is : de volgende maand die 1 maand verder ligt dan de 1e t/m 28e van deze maand.

Het is net zoiets als op een zondag aan iemand gaan vragen wat hij volgende week maandag gaat doen. Dat gaat ook niet altijd goedkomen.

  • NMe
  • Registratie: februari 2004
  • Nu online

NMe

Quia Ego Sic Dico.

NiGhTsPiRiT schreef op zondag 31 oktober 2010 @ 23:22:
[...]

Logisch: ja. Gewenst (in dit geval) niet.
In dit geval niet maar in zo'n beetje elk ander geval wel. Die functie zal altijd een te vroege datum (30 november), een incorrecte datum (31 november) of een te late datum (1 december) moeten geven. Van die drie opties vond het team achter PHP (IMO terecht) de laatste het meest logisch. :)
Gomez12 schreef op maandag 01 november 2010 @ 00:23:
[...]

Gewenst gedrag was een correctere omschrijving van de gevraagde waarde...

Volgende maand is gewoon niet gedefinieerd als iets.
In het stukje code dat ik aanhaal staat anders niet "volgende maand" maar "+1 maand", en dat is wel duidelijk, afgezien van het probleem wat je moet doen na de 28e. :)

[Voor 31% gewijzigd door NMe op 01-11-2010 09:37]

'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


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee