Automattic\WooCommerce\Admin\API\Reports

TimeInterval::intervals_between()public staticWC 1.0

Calculates number of time intervals between two dates, closed interval on both sides.

Метод класса: TimeInterval{}

Хуков нет.

Возвращает

int.

Использование

$result = TimeInterval::intervals_between( $start_datetime, $end_datetime, $interval );
$start_datetime(DateTime) (обязательный)
Start date & time.
$end_datetime(DateTime) (обязательный)
End date & time.
$interval(строка) (обязательный)
Time interval increment, e.g. hour, day, week.

Код TimeInterval::intervals_between() WC 8.7.0

public static function intervals_between( $start_datetime, $end_datetime, $interval ) {
	switch ( $interval ) {
		case 'hour':
			$end_timestamp   = (int) $end_datetime->format( 'U' );
			$start_timestamp = (int) $start_datetime->format( 'U' );
			$addendum        = 0;
			// modulo HOUR_IN_SECONDS would normally work, but there are non-full hour timezones, e.g. Nepal.
			$start_min_sec = (int) $start_datetime->format( 'i' ) * MINUTE_IN_SECONDS + (int) $start_datetime->format( 's' );
			$end_min_sec   = (int) $end_datetime->format( 'i' ) * MINUTE_IN_SECONDS + (int) $end_datetime->format( 's' );
			if ( $end_min_sec < $start_min_sec ) {
				$addendum = 1;
			}
			$diff_timestamp = $end_timestamp - $start_timestamp;

			return (int) floor( ( (int) $diff_timestamp ) / HOUR_IN_SECONDS ) + 1 + $addendum;
		case 'day':
			$days               = $start_datetime->diff( $end_datetime )->format( '%r%a' );
			$end_hour_min_sec   = (int) $end_datetime->format( 'H' ) * HOUR_IN_SECONDS + (int) $end_datetime->format( 'i' ) * MINUTE_IN_SECONDS + (int) $end_datetime->format( 's' );
			$start_hour_min_sec = (int) $start_datetime->format( 'H' ) * HOUR_IN_SECONDS + (int) $start_datetime->format( 'i' ) * MINUTE_IN_SECONDS + (int) $start_datetime->format( 's' );
			if ( $end_hour_min_sec < $start_hour_min_sec ) {
				$days++;
			}

			return $days + 1;
		case 'week':
			// @todo Optimize? approximately day count / 7, but year end is tricky, a week can have fewer days.
			$week_count = 0;
			do {
				$start_datetime = self::next_week_start( $start_datetime );
				$week_count++;
			} while ( $start_datetime <= $end_datetime );
			return $week_count;
		case 'month':
			// Year diff in months: (end_year - start_year - 1) * 12.
			$year_diff_in_months = ( (int) $end_datetime->format( 'Y' ) - (int) $start_datetime->format( 'Y' ) - 1 ) * 12;
			// All the months in end_date year plus months from X to 12 in the start_date year.
			$month_diff = (int) $end_datetime->format( 'n' ) + ( 12 - (int) $start_datetime->format( 'n' ) );
			// Add months for number of years between end_date and start_date.
			$month_diff += $year_diff_in_months + 1;
			return $month_diff;
		case 'quarter':
			// Year diff in quarters: (end_year - start_year - 1) * 4.
			$year_diff_in_quarters = ( (int) $end_datetime->format( 'Y' ) - (int) $start_datetime->format( 'Y' ) - 1 ) * 4;
			// All the quarters in end_date year plus quarters from X to 4 in the start_date year.
			$quarter_diff = self::quarter( $end_datetime ) + ( 4 - self::quarter( $start_datetime ) );
			// Add quarters for number of years between end_date and start_date.
			$quarter_diff += $year_diff_in_quarters + 1;
			return $quarter_diff;
		case 'year':
			$year_diff = (int) $end_datetime->format( 'Y' ) - (int) $start_datetime->format( 'Y' );
			return $year_diff + 1;
	}
	return 0;
}