Skip to content
← Back to Functions
Code

Timezone Validator

Validates timezone identifiers and returns a safe DateTimeZone name.

Function signature

ogValidateTimezoneName(timezone, fallback_timezone = 'UTC')

Categories

  • Forms and Validation

Parameters

timezoneRaw timezone name.fallback_timezoneFallback timezone used when the raw value is invalid.

Return value

Short public-safe status message.

  • timezone
  • fallback_used

Compatibility

Existing function name and call order preserved; metadata signature corrected to source.

Minimum PHP version: 7.4

Security notes

Validate request method, identity, permissions, and caller-owned allowlists before use; keep secrets and internal paths out of public output.

Code

<?php

/*
 * Copyright (c) 2026 Jeffery L. Paris <jparis@phpog.com>.
 * Free for personal and internal use. Paid project use requires visible credit
 * to Jeffery L. Paris. Corporate use requires a paid license fee unless a
 * separate written license states otherwise.
 */

/**
 * Validates timezone identifiers and returns a safe DateTimeZone name.
 *
 * Primary use case: Scheduling, reports, user profiles.
 * Typical inputs: raw timezone, fallback.
 * Typical output: timezone string.
 *
 * Implementation note: Use timezone_identifiers_list in implementation.
 *
 * @param string $timezone Raw timezone name.
 * @param string $fallback_timezone Fallback timezone used when the raw value is invalid.
 * @return array Structured validation result with timezone, fallback flag, and offset metadata.
 */
function ogValidateTimezoneName($timezone, $fallback_timezone = 'UTC') {
	$result = array(
		'success' => false,
		'message' => '',
		'data' => array()
	);

	$timezone = trim((string)$timezone);
	$fallback_timezone = trim((string)$fallback_timezone);

	if (empty($fallback_timezone)) {
		$fallback_timezone = 'UTC';
	}

	$available_timezones = timezone_identifiers_list();
	if (!in_array($fallback_timezone, $available_timezones, true)) {
		$fallback_timezone = 'UTC';
	}

	$accepted_timezone = $fallback_timezone;
	$is_fallback = true;
	if (!empty($timezone) && in_array($timezone, $available_timezones, true)) {
		$accepted_timezone = $timezone;
		$is_fallback = false;
	}

	$timezone_object = new DateTimeZone($accepted_timezone);
	$offset_seconds = $timezone_object->getOffset(new DateTimeImmutable('now', $timezone_object));

	$result['success'] = true;
	if ($is_fallback) {
		$result['message'] = 'Timezone rejected; fallback applied.';
	} else {
		$result['message'] = 'Timezone accepted.';
	}
	$result['data'] = array(
		'timezone' => $accepted_timezone,
		'is_fallback' => $is_fallback,
		'offset_seconds' => $offset_seconds
	);

	return $result;
}