Just Blog about nothing

15Июнь/11Off

Работа с датой и временем

Утилита для работы с датой и временем из GMFramework. Класс написан был давно, но в PHP 5.2 появился класс DateTime, фактически являющийся объектно-ориентированный обёрткой для привычных функций. После этого я унаследовал свой DateTimeUtils от него и оставил только статические методы, надеясь в дальнейшем расширять функционал по мере необходимости.

На данный момент основное предназначение класса - вывод даты в формате mysql datetime и конвертация его в unixtime.

<?
/**
 * DateTimeUtils
 * Утилиты для работы со временем и датой
 * @package ru.vbinc.gm.framework.datetime
 * @author GreyMag
 * @copyright 2009
 * @version 0.5
 * @access public
 * @link http://www.php.net/manual/ru/class.datetime.php
 */
class DateTimeUtils extends DateTime
{
	/**
	 * Текущая дата (unixtime в секундах)
	 * на момент подключения класса
	 * @var int
	 */
	public static $currentDate;
	/**
	 * Сдвиг относительно времени сервера (в секундах)
	 * @var int
	 */
	private static $_timeAdjust = 0;

	/**
	 * Получает поправку для времени в секундах
	 * @return int
	 */
	public static function getTimeAdjust()
	{
		return ( self::$_timeAdjust > 0 || !defined( TIMEADJUST ) ) ? self::$_timeAdjust : TIMEADJUST;
	}

	/**
	 * Возвращает дату в заданном формате
	 * @param string $format
	 * @param integer $unixtime Дата для преобразования, по умолчанию - текущая
	 * @return string
	 */
	public static function date( $format = 'U', $unixtime = -1 )
	{
		if( $unixtime < 0 ) $unixtime = time() + DateTimeUtils::getTimeadjust();
		return date( $format, $unixtime );
	}

	/**
	 * Преобразует дату в формат datetime mysql
	 * @param int $unixtime Дата для преобразования, по умолчанию - текущая
	 * @return string Дата в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС
	 */
	public static function mysqlDate( $unixtime = -1 )
	{
		return DateTimeUtils::date( DateTimeFormat::YEAR_NUMBER_4_DIGITS       . '-' .
		                            DateTimeFormat::MONTH_NUMBER_2_DIGITS      . '-' .
		                            DateTimeFormat::DAY_OF_MONTH_2             . ' ' .
		                            DateTimeFormat::HOUR_24_NUMBER_2_DIGITS    . ':' .
		                            DateTimeFormat::MINUTES_OF_HOUR_2_DIGITS   . ':' .
		                            DateTimeFormat::SECONDS_OF_MINUTE_2_DIGITS,
		                            $unixtime );
	}

	/**
	 * Преобразование даты из mysql datetime формата в заданный
	 * @param string $mysqlDate Дата в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС
	 * @param string $printFormat Формат возврата даты, по умолчанию unixtime
	 * @param string $locale Массив локалей, по умолчанию - русская
	 * @return string Дата в заданном формате
     * @link http://ru.php.net/manual/en/function.strftime.php
	 * @link http://php.net/manual/ru/function.setlocale.php
	 */
	public static function convertMysqlDate( $mysqlDate, $printFormat = '', $locale = null )
	{
		preg_match( "/^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$/", $mysqlDate, $date );

		$timestamp = mktime( (int)$date[4], (int)$date[5], (int)$date[6], (int)$date[2], (int)$date[3], (int)$date[1] );

		if( empty( $printFormat ) ) return $timestamp;
		else
		{
			if( $locale == null ) setlocale( LC_ALL, 'ru_RU.UTF-8', 'rus_RUS.UTF-8', 'Russian_Russia.65001');
			else setlocale( LC_ALL, $locale );

			return strftime( $printFormat, $timestamp );
		}
	}

	/**
	 * Установить разницу во времени в секундах
	 * @param int $value
	 */
	public static function setTimeAdjust( $value )
	{
		self::$_timeAdjust = (float)$value;
		// устанавливаем текущую дату
		self::$currentDate = self::date();
	}
}

// замена статического конструктора
// долбанный php, почему здесь нет таких простых вещей
DateTimeUtils::$currentDate = DateTimeUtils::date();
?>

Утилита использует также вспомогательный класс, содержащий константы формата.

<?php
/**
 * Формат вывода даты и времени
 * @author GreyMag
 * @package ru.vbinc.gm.framework.datetime
 * @author GreyMag
 * @copyright 2011
 * @version 0.1
 */
class DateTimeFormat
{
    /***********************
     * Day
     */
    /**
     * Day of the month, 2 digits with leading zeros
     * 01 to 31
     */
    const DAY_OF_MONTH_2 = 'd';
    /**
    * A textual representation of a day, three letters
    * Mon through Sun
    */
    const DAY_OF_WEEK_3_LETTERS = 'D';
    /**
     * Day of the month without leading zeros
     * 1 to 31
     */
    const DAY_OF_MONTH = 'j';
    /**
     * A full textual representation of the day of the week
     * Sunday through Saturday
     */
    const SAY_OF_WEEK_STRING = 'l';
    /**
     * ISO-8601 numeric representation of the day of the week (added in PHP 5.1.0)
     * 1 (for Monday) through 7 (for Sunday)
     */
    const DAY_OF_WEEK_NUMBER_ISO8601 = 'N';
    /**
     * English ordinal suffix for the day of the month, 2 characters
     * st, nd, rd or th. Works well with j
     */
    const DAY_OF_MONTH_SUFFIX = 'S';
    /**
     * Numeric representation of the day of the week
     * 0 (for Sunday) through 6 (for Saturday)
     */
    const DAY_OF_WEEK_NUMBER = 'w';
    /**
     * The day of the year (starting from 0)
     * 0 through 365
     */
    const DAY_OF_YEAR = 'z';   

    /***********************
     * Week
     */
    /**
     * ISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0)
     * Example: 42 (the 42nd week in the year)
     */
    const WEEK_NUMBER_OF_YEAR = 'W';  

    /***********************
     * Month
     */
    /**
     * A full textual representation of a month, such as January or March
     * January through December
     */
    const MONTH_TEXTUAL = 'F';
    /**
     * Numeric representation of a month, with leading zeros
     * 01 through 12
     */
    const MONTH_NUMBER_2_DIGITS = 'm';
    /**
     * A short textual representation of a month, three letters
     * Jan through Dec
     */
    const MONTH_TEXTUAL_SHORT = 'M';
    /**
     * Numeric representation of a month, without leading zeros
     * 1 through 12
     */
    const MONTH_NUMBER = 'n';
    /**
     * Number of days in the given month
     * 28 through 31
     */
    const DAYS_IN_MONTH = 't';

    /***********************
     * Year
     */
    /**
     * Whether it's a leap year
     * 1 if it is a leap year, 0 otherwise.
     */
    const LEAP_YEAR = 'L';
    /**
     * ISO-8601 year number. This has the same value as Y,
     * except that if the ISO week number (W) belongs to the previous or next year,
     * that year is used instead. (added in PHP 5.1.0)
     * Examples: 1999 or 2003
     */
    const YEAR_ISO8601 = 'o';
    /**
     * A full numeric representation of a year, 4 digits
     * Examples: 1999 or 2003
     */
    const YEAR_NUMBER_4_DIGITS = 'Y';
    /**
     * A two digit representation of a year
     * Examples: 99 or 03
     */
    const YEAR_NUMBER_2_DIGITS = 'y';    

    /***********************
     * Time
     */
    /**
     * Lowercase Ante meridiem and Post meridiem
     * am or pm
     */
    const AM_PM_LOWERCASE = 'a';
    /**
     * Uppercase Ante meridiem and Post meridiem
     * AM or PM
     */
    const AM_PM_UPPERCASE = 'A';
    /**
     * Swatch Internet time
     * 000 through 999
     */
    const SWATCH_INTERNET_TIME = 'B';
    /**
     * 12-hour format of an hour without leading zeros
     * 1 through 12
     */
    const HOUR_12_NUMBER = 'g';
    /**
     * 24-hour format of an hour without leading zeros
     * 0 through 23
     */
    const HOUR_24_NUMBER = 'G';
    /**
     * 12-hour format of an hour with leading zeros
     * 01 through 12
     */
    const HOUR_12_NUMBER_2_DIGITS = 'h';
    /**
     * 24-hour format of an hour with leading zeros
     * 00 through 23
     */
    const HOUR_24_NUMBER_2_DIGITS = 'H';
    /**
     * Minutes with leading zeros
     * 00 to 59
     */
    const MINUTES_OF_HOUR_2_DIGITS = 'i';
    /**
     * Seconds, with leading zeros
     * 00 through 59
     */
    const SECONDS_OF_MINUTE_2_DIGITS = 's';
    /**
     * Microseconds (added in PHP 5.2.2)
     * Example: 654321
     */
    const MICROSECONDS = 'u';

    /***********************
     * Timezone
     */
    /**
     * Timezone identifier (added in PHP 5.1.0)
     * Examples: UTC, GMT, Atlantic/Azores
     */
    const TIMEZONE_IDENTIFIER = 'e';
    /**
     * Whether or not the date is in daylight saving time
     * 1 if Daylight Saving Time, 0 otherwise.
     */
    const DAYLIGHT_SAVING_TIME = 'I';
    /**
     * Difference to Greenwich time (GMT) in hours
     * Example: +0200
     */
    const DIFFERENCE_2_GMT = 'O';
    /**
     * Difference to Greenwich time (GMT) with colon between hours and minutes (added in PHP 5.1.3)
     * Example: +02:00
     */
    const DIFFERENCE_2_GMT_COLON = 'P';
    /**
     * Timezone abbreviation
     * Examples: EST, MDT ...
     */
    const TIMEZONE_ABBREVIATION = 'T';
    /**
     * Timezone offset in seconds. The offset for timezones west of UTC is always negative,
     * and for those east of UTC is always positive.
     * -43200 through 50400
     */
    const TIMEZONE_OFFSET_SECONDS = 'Z';     

    /***********************
     * Full Date/Time
     */
    /**
     * ISO 8601 date (added in PHP 5)
     * 2004-02-12T15:19:21+00:00
     */
    const ISO8601_DATE = 'c';
    /**
     * RFC 2822 formatted date
     * Example: Thu, 21 Dec 2000 16:01:07 +0200
     */
    const RFC2822_DATE = 'r';
    /**
     * Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
     * See also time()
     */
    const UNIXTIME_SECONDS = 'U';
}
?>
Комментарии (0) Пинги (0)

Извините, комментировать здесь запрещено.

Trackbacks are disabled.

Social Widgets powered by AB-WebLog.com.