PHP Function for Calculating End Time from 4-Digit Start Time and Duration

February 24, 2025
One of the functions necessary for the Tablepress Simple TV Schedule Shortcode Extension accepts a 4-digit start time and an episode duration as arguments, returning an array containing a 4-digit end time, as well as the episode’s start and end time in a user-readable format. The math involved is fairly simple, mixed with string operations to accomplish the task.
function calculatestartendtimes( $starttime,$duration) {

	// Parse the start time from 24-hour (hhmm) to hour and minutes
	$starttimehours = substr($starttime,0,2);
	$begintimehours = absint($starttimehours);
	
	$starttimeminutes = substr($starttime,2,2);
	$starttimeminutes = sprintf("%02s", $starttimeminutes);
	
	if (($begintimehours > 23) or ($starttimeminutes > 59)) {
		
		// return errors for incorrect start time
		$endtime = '0000';
		$begintimedisplay = 'Incorrect start time';
		$endtimedisplay = 'Incorrect start time';
		
	} else {
	
		// ensure start time is 4-digit for display
		$starttime = sprintf("%04s", $starttime);
		
		// Identify the meridian
		if ($begintimehours > 11) {
			if ($begintimehours > 12) {
				// convert to 12-hour time
				$begintimehours = $begintimehours - 12;
			}
			$meridianbegin = 'pm';
		} else {
			$meridianbegin = 'am';
		}
		
		if ($begintimehours == 0) {
			$begintimehours = 12;
		}

		// calculate start minutes since midnight
		$startsincemidnight = 0;
		$startsincemidnight = intval($starttimehours) * 60;
		$startsincemidnight = $startsincemidnight + $starttimeminutes;
		
		// add duration
		$endsincemidnight = $startsincemidnight + intval($duration);
		
		// set 4-digit result
		// remainder = dividend % divisor;
		// quotient = (dividend - remainder) / divisor;
		$endtimemn = intval($endsincemidnight) % 60;					// modulus operator
		$endtimemn = sprintf("%02s", $endtimemn);
		$endtimehr = ($endsincemidnight - $endtimemn) / 60;
		
		// account for midnight transition
		If ($endtimehr > 23) {
			$endtimehr = $endtimehr - 24;
		}
		
		// concatenate the result, and set to 4-digit
		$endtime = $endtimehr . $endtimemn;
		$endtime = sprintf("%04s", $endtime);
		
		// Identify the meridian
		if ($endtimehr > 11) {
			if ($endtimehr > 12) {
				// convert to 12-hour time
				$endtimehr = $endtimehr - 12;
			}
			$meridianend = 'pm';
		} else {
			$meridianend = 'am';
		}
		
		if ($endtimehr == 0) {
			$endtimehr = 12;
		}
		
		$begintimedisplay = strval( $begintimehours ) . ':' . $starttimeminutes . $meridianbegin;
		$endtimedisplay = strval( $endtimehr ) . ':' . $endtimemn . $meridianend;
	
	}
	
	return [$endtime, $begintimedisplay, $endtimedisplay];
	
}

Usage then becomes relatively straightforward:

$calculationarray = calculatestartendtimes( $timestart, $duration);

// Set the start time to the previous end time
// for the beginning of the next loop
$timestart = $calculationarray[0];	// this episode's end time

$begintimedisplay = $calculationarray[1];
$endtimedisplay = $calculationarray[2];
This function is used to calculate the start and end times for every episode / Tablepress table in the Tablepress Simple TV Schedule Shortcode Extension, and can be used with most arbitrary but correct values.