<?php
/*
** Zabbix
** Copyright (C) 2001-2025 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
**/

/**
 * Date and time helper.
 */
class CDateTimeHelper {

	/**
	 * Check if time zone observe the daylight saving time.
	 *
	 * @param string $timezone		time-zone name
	 *
	 * @return boolean
	 */
	public static function isDaylightSavingTime($timezone) {
		$zone = new DateTimeZone($timezone);
		$time = time();
		$transition = $zone->getTransitions($time, $time);

		return $transition[0]['isdst'];
	}

	/**
	 * Get the UTC offset for a specific time zone.
	 *
	 * @param string $timezone		time-zone name
	 *
	 * @return string
	 */
	public static function getUTCOffset($timezone) {
		$offset = (strtotime('now UTC') - strtotime('now '.$timezone));
		$sign = $offset >= 0 ? '+' : '-';
		$offset = abs($offset);

		return sprintf('UTC%s%02d:%02d', $sign, $offset / 3600, ($offset / 60) % 60);
	}

	/**
	 * Get time zone with UTC time usable as label in time-zone drop-downs.
	 *
	 * @param string $label		time zone name or default value of time-zone dropdown
	 *
	 * @return string
	 */
	public static function getTimeZoneFormat($label) {
		$timezone = ($label === 'System' || $label === 'System default') ? 'Europe/Riga' : $label;
		$utc = CDateTimeHelper::getUTCOffset($timezone);

		return (($label === 'System' || $label === 'System default') ? $label .': ': '').'('.$utc.') '.$timezone;
	}

	/**
	 * The days are counted from specific date and time period.
	 *
	 * @param string $date		timestamp
	 * @param string $period	time period
	 *
	 * @return int
	 */
	public static function countDays($date = 'now', $period = 'P1Y') {
		$to = new DateTime($date);
		$from = (clone $to)->sub(new DateInterval($period));

		return $from->diff($to)->days;
	}

	/**
	 * Get the time difference in months between two moments in time.
	 *
	 * @param string|int	$from		timestamp or string that represents the oldest moments in time
	 * @param string|int	$to			timestamp or string that represents the newest moments in time
	 *
	 * @return int
	 */
	public static function countMonthsBetweenDates($from, $to = 'now') {
		foreach ([&$from, &$to] as &$moment) {
			if (is_string($moment)) {
				$moment = strtotime($moment);
			}
		}
		unset($moment);

		return ((date('Y', $to) - date('Y', $from)) * 12) + ((date('m', $to) - date('m', $from)));
	}
}