Week functies

Gepost door Vincent V op 12-09-2010 15:22.

Ik heb hieronder 3 functie, verdere beschrijving ervan vind je terug boven iedere functie. Aangezien dit niet is ingebouwd in php en ik het nodig had, heb ik het gemaakt. Foutcontrole is ingebouwd.

Hopelijk zijn jullie er iets mee.

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
/**
 * @author Vincent Verweij
 * @copyright 2010-09-12
 */

/**
 * This function gives back how many weeks there are in the given month
 * @param   $month      int
 * @param   $year       int
 * @return  $week       total weeks of month
 * @return  false on failure
 **/
function GetTotalWeeksOfMonth($month, $year)
{
    //check for wrong input
    if(($month < 1) || ($month > 12))
        return false;

    if(($year < 0) || ($year > 9999))
        return false;

    //initialize
    $daysInMonth = date("t", mktime(0, 0, 0, $month, 1, $year));
    $week = 1;

    //search for total weeks
    for ($i = 1; $i <= $daysInMonth; $i++)
    {
        $currentDayName = date("l", mktime(0, 0, 0, $month, $i, $year));

        if (($currentDayName == 'Monday') && ($i != 1))
            $week++;
    }
    
    return $week;
}

/**
 * This function gives back the current week you're in at the given date
 * @param   $day        int
 * @param   $month      int
 * @param   $year       int
 * @return  $week       current weeknumber in month
 * @return  false on failure
 **/
function GetWeekOfMonth($day, $month, $year)
{
    //check for wrong input
    if (($month < 1) || ($month > 12))
        return false;

    if (($year < 0) || ($year > 9999))
        return false;

    $daysInMonth = date("t", mktime(0, 0, 0, $month, 1, $year));
    if (($day < 1) || ($day > $daysInMonth))
        return false;

    //initialize
    $dayNameNeeded = date("l", mktime(0, 0, 0, $month, $day, $year));
    $week = 1;
    $i = 1;

    //search for current week of month
    while ($i <= $day)
    {
        $currentDayName = date("l", mktime(0, 0, 0, $month, $i, $year));

        if (($currentDayName) == 'Monday' && ($i != 1))
            $week++;

        $i++;
    }

    return $week;
}

/**
 * This function gives back an array. For example every saturday if you give '2010-09-04'
 * @param   $day        int
 * @param   $month      int
 * @param   $year       int
 * @param   $week       int
 * @return  $array      array with keys for each month and date values of every given week
 * @return  false on failure
 **/

function GetEveryMonthDate($day, $month, $year, $weekNeeded)
{
    //initialize
    $dayNameNeeded = date("l", mktime(0, 0, 0, $month, $day, $year));
    $array = array();
    
    //check for wrong input
    if (($month < 1) || ($month > 12))
        return false;

    if (($year < 0) || ($year > 9999))
        return false;

    $daysInMonth = date("t", mktime(0, 0, 0, $month, 1, $year));
    if (($day < 1) || ($day > $daysInMonth))
        return false;
        
    $totalWeeks = GetTotalWeeksOfMonth($month, $year);
    if ($week > $totalWeeks)
        return false;
    
    //loop for the array
    for($m = 1; $m <= 12; $m++)
    {
        //reset values
        $week = 1;
        $daysInMonth = date("t", mktime(0, 0, 0, $m, 1, $year));
        $dateFound = false;
        $i = 1;
        
        //correct date search
        while ($i <= $daysInMonth && !$dateFound)
        {
            $currentDayName = date("l", mktime(0, 0, 0, $m, $i, $year));
            $currentMonth = date("M", mktime(0, 0, 0, $m, $i, $year));
            
            if (($currentDayName) == 'Monday' && ($i != 1))
                $week++;
    
            if ($week == $weekNeeded)
            {
                if ($currentDayName == $dayNameNeeded)
                {
                    if($m < 10)
                        $m = '0'.$m;
                    
                    if($i < 10)
                        $i = '0'.$i;
                    
                    $correctDate = "$year-$m-$i";
                    $array[$currentMonth] = $correctDate;
                    $dateFound = true;
                }
            }
    
            $i++;
        }
    }
    
    return $array;
}

Bestanden van dit script

functions.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
<?php

/**
 * @author Vincent Verweij
 * @copyright 2010-09-12
 */

/**
 * This function gives back how many weeks there are in the given month
 * @param   $month      int
 * @param   $year       int
 * @return  $week       total weeks of month
 * @return  false on failure
 **/
function GetTotalWeeksOfMonth($month, $year)
{
    //check for wrong input
    if(($month < 1) || ($month > 12))
        return false;

    if(($year < 0) || ($year > 9999))
        return false;

    //initialize
    $daysInMonth = date("t", mktime(0, 0, 0, $month, 1, $year));
    $week = 1;

    //search for total weeks
    for ($i = 1; $i <= $daysInMonth; $i++)
    {
        $currentDayName = date("l", mktime(0, 0, 0, $month, $i, $year));

        if (($currentDayName == 'Monday') && ($i != 1))
            $week++;
    }
    
    return $week;
}

/**
 * This function gives back the current week you're in at the given date
 * @param   $day        int
 * @param   $month      int
 * @param   $year       int
 * @return  $week       current weeknumber in month
 * @return  false on failure
 **/
function GetWeekOfMonth($day, $month, $year)
{
    //check for wrong input
    if (($month < 1) || ($month > 12))
        return false;

    if (($year < 0) || ($year > 9999))
        return false;

    $daysInMonth = date("t", mktime(0, 0, 0, $month, 1, $year));
    if (($day < 1) || ($day > $daysInMonth))
        return false;

    //initialize
    $dayNameNeeded = date("l", mktime(0, 0, 0, $month, $day, $year));
    $week = 1;
    $i = 1;

    //search for current week of month
    while ($i <= $day)
    {
        $currentDayName = date("l", mktime(0, 0, 0, $month, $i, $year));

        if (($currentDayName) == 'Monday' && ($i != 1))
            $week++;

        $i++;
    }

    return $week;
}

/**
 * This function gives back an array. For example every saturday if you give '2010-09-04'
 * @param   $day        int
 * @param   $month      int
 * @param   $year       int
 * @param   $week       int
 * @return  $array      array with keys for each month and date values of every given week
 * @return  false on failure
 **/
//TODO geeft array terug van january tot december met juiste data, grote M voor in array
function GetEveryMonthDate($day, $month, $year, $weekNeeded)
{
    //initialize
    $dayNameNeeded = date("l", mktime(0, 0, 0, $month, $day, $year));
    $array = array();
    
    //check for wrong input
    if (($month < 1) || ($month > 12))
        return false;

    if (($year < 0) || ($year > 9999))
        return false;

    $daysInMonth = date("t", mktime(0, 0, 0, $month, 1, $year));
    if (($day < 1) || ($day > $daysInMonth))
        return false;
        
    $totalWeeks = GetTotalWeeksOfMonth($month, $year);
    if ($week > $totalWeeks)
        return false;
    
    //loop for the array
    for($m = 1; $m <= 12; $m++)
    {
        //reset values
        $week = 1;
        $daysInMonth = date("t", mktime(0, 0, 0, $m, 1, $year));
        $dateFound = false;
        $i = 1;
        
        //correct date search
        while ($i <= $daysInMonth && !$dateFound)
        {
            $currentDayName = date("l", mktime(0, 0, 0, $m, $i, $year));
            $currentMonth = date("M", mktime(0, 0, 0, $m, $i, $year));
            
            if (($currentDayName) == 'Monday' && ($i != 1))
                $week++;
    
            if ($week == $weekNeeded)
            {
                if ($currentDayName == $dayNameNeeded)
                {
                    if($m < 10)
                        $m = '0'.$m;
                    
                    if($i < 10)
                        $i = '0'.$i;
                    
                    $correctDate = "$year-$m-$i";
                    $array[$currentMonth] = $correctDate;
                    $dateFound = true;
                }
            }
    
            $i++;
        }
    }
    
    return $array;
}
?>

Commentaar

12-09-2010 15:23

Wist niet dat het script direct werd getoond als het upgeload werd, vandaar dat het 2 keer getoond wordt...

13-09-2010 11:51

Aangezien dit niet is ingebouwd in php

http://nl3.php.net/manual/en/ref.calendar.php

en

http://nl3.php.net/manual/en/function.checkdate.php

Scheelt weer een bult code ;)

14-09-2010 19:22

GetWeekOfMonth() is sinds PHP5.3 ook beschikbaar via Intl :)

Goed script, waar zijn de rate knoppen gebleven?

15-09-2010 00:50

Sebastiaan, ben je er zeker van dat de GetWeekOfMonth() functie bestaat ? Heb al verschillende fora bekeken including php.net en daar staat het niet tussen. Ook is het meestal als je een functie naam in google invult met daarachter php dat je direct de manual van php krijgt voorgeschoteld, nu ook niet. Maar toch bedankt om even te melden. En ja een rating zou handig zijn :-)

Jos, misschien een stomme vraag maar in jou links zie ik niets wat heeft te maken met week functies, toch ? Of is er iets teveel in mijn script dat ik met de kalender functies moet aanpassen ?

Greetz!

19-09-2010 17:55

Een paar puntjes:
- Geef je functies duidelijke namen, "geteverymonthdate" vertaalt naar "haal elke maand datum" en dat zegt mij helemaal niets.
- Je gaat er vanniuit dat de boel altijd in het Engels zal werken: " if (($currentDayName == 'Monday')"
- Je gaat er vanuit dat weken altijd op maandag beginnen
- je laat de mktime parameters doorgeven aan de functie, wat betekent dat je dus eerst die data moet opsplitsen voordat jouw functies aangeroepen kunnen worden. Dat is nogal vervelend omdat je de aanroeper dus verplicht zich aan te passen aan jouw manier van werken. Verander je functie zo dat hij een timestamp verwacht, dat is een stuk eenvoudiger.

- Je controleert wel op fouten maar geeft geen indicatie over wat er fout is. Als je functie FALSE teruggeeft weet je niet waarom.

Maar vooral; heb je voorbeelden van waar je deze functies voor zou kunnen gebruiken?

20-09-2010 20:54

Hey naamgenoot :-)

Bedankt voor de puntjes, altijd goed om zulke puntjes te horen, zodat ik ze kan verbeteren.

Wel eerst om op jou vraag terug te komen van: een voorbeeld
Ik was een klein systeempje aan het maken waar de gebruiker flyers moet uploaden, hierbij horen datums. Nu moest ik bijvoorbeeld weten wanneer de 2de zaterdag van de volgende maand was, en dat vond ik nergens noch in mysql noch in php, vandaar deze functie.

Nu de puntjes:
- Voor die functienaam zat ik zelf in de knoop, kon er niet direct een goede naam voor vinden, suggesties zijn welkom (al kan ik niet veel wijzigen in het script hierboven -> geen edit knop...)
- Ja er vanuit gaan dat het altijd begint op maandag is slecht, maar aangezien ik met de gedachte zat dat m'n script toch niet uit Belgiƫ en Nederland dacht ik dat het in orde was. Zou dit kunnen oplossen met een parameter $weekBegin = 'Sunday' of 'Monday' (denk ik)

- Hoe kan ik checken of het gaat om engels, nederlands of andere talen ?

- Ik denk dat je met je 4de puntje het laatste bedoeld, dat ik een array teruggeef met daarin de data in yyyy-mm-dd format. Ik heb speciaal dit format gekozen omdat dit compatibel is met het date veld van Mysql. Dus moet ik dan in timestamp zetten dat vervalt in 2038 tov date veld dat vervalt in ... ? Ik weet wel dat het een beetje ver gezocht is, m'n argument, maar snap je wat ik bedoel ?

- Moet ik ipv false een string terugsturen met een foutmelding ?

Groeten

26-09-2010 10:32

http://nl3.php.net/manual/en/class.intldateformatter.php

Het is niet een directe functie, maar je kan hem opvragen met IntlDateFormatter::format

http://www.icu-project.org/apiref/icu4c/classSimpleDateFormat.html#_details

W week in month (Number) 2

27-09-2010 00:04

Hey Sebastiaan

Leuk dat ze het gemaakt hebben. Het jammere aan dit alles is dat het vanaf 5.3 is en ik heb ( :-P ) 5.2.42, echt bale...

Toch bedankt voor de handige informatie

Inloggen wachtwoord vergeten? Aanmelden