CodeSOD: Give Your Date a Workout
Bob E inherited a site which helps amateur sports clubs plan their recurring workouts/practices during the season. To do this, given the start date of the season, and the number of weeks, it needs to figure out all of the days in that range.
function GenWorkoutDates(){ global $SeasonStartDate, $WorkoutDate, $WeeksInSeason; $TempDate = explode("/", $SeasonStartDate); for ($i = 1; $i <= $WeeksInSeason; $i++) { for ($j = 1; $j <= 7; $j++) { $MonthName = substr("JanFebMarAprMayJunJulAugSepOctNovDec", $TempDate[0] * 3 - 3, 3); $WorkoutDate[$i][$j] = $MonthName . " " . $TempDate[1] . " "; $TempDate[1] += 1; switch ( $TempDate[0] ) { case 9: case 4: case 6: case 11: $DaysInMonth = 30; break; case 2: $DaysInMonth = 28; switch ( $TempDate[2] ) { case 2012: case 2016: case 2020: $DaysInMonth = 29; break; default: $DaysInMonth = 28; break; } break; default: $DaysInMonth = 31; break; } if ($TempDate[1] > $DaysInMonth) { $TempDate[1] = 1; $TempDate[0] += 1; if ($TempDate[0] > 12) { $TempDate[0] = 1; $TempDate[2] += 1; } } } }}
I do enjoy that PHP's string-splitting function is called explode. That's not a WTF. More functions should be called explode.
This method of figuring out the month name, though:
$MonthName = substr("JanFebMarAprMayJunJulAugSepOctNovDec", $TempDate[0] * 3 - 3, 3);
I want to hate it, but I'm impressed with it.
From there, we have lovely hard-coded leap years, the "Thirty days has September"" poem implemented as a switch statement, and then that lovely rollover calculation for the end of a month (and the end of the year).
"I'm not a PHP developer," Bob writes. "But I know how to use Google." After some googling, he replaced this block of code with a 6-line version that uses built-in date handling functions.
[Advertisement] Continuously monitor your servers for configuration changes, and report when there's configuration drift. Get started with Otter today!