all-in-one-event-calendar/lib/date/system.php
2017-11-09 17:36:04 +01:00

279 lines
8.7 KiB
PHP

<?php
/**
* Wrap library calls to date subsystem.
*
* Meant to increase performance and work around known bugs in environment.
*
* @author Time.ly Network, Inc.
* @since 2.0
* @package Ai1EC
* @subpackage Ai1EC.Date
*/
class Ai1ec_Date_System extends Ai1ec_Base {
/**
* @var array List of local time (key '0') and GMT time (key '1').
*/
protected $_current_time = array();
/**
* @var Ai1ec_Cache_Memory
*/
protected $_gmtdates;
/**
* Initiate current time list.
*
* @param Ai1ec_Registry_Object $registry
*
* @return void
*/
public function __construct( Ai1ec_Registry_Object $registry ) {
parent::__construct( $registry );
$gmt_time = ( version_compare( PHP_VERSION, '5.1.0' ) >= 0 )
? time()
: gmmktime();
$requestTime = isset( $_SERVER['REQUEST_TIME'] ) ? (int)$_SERVER['REQUEST_TIME'] : time();
$this->_current_time = array(
$requestTime,
$gmt_time,
);
$this->_gmtdates = $registry->get( 'cache.memory' );
}
/**
* Get current time UNIX timestamp.
*
* Uses in-memory value, instead of re-calling `time()` / `gmmktime()`.
*
* @param bool $is_gmt Set to true to get GMT timestamp.
*
* @return int Current time UNIX timestamp
*/
public function current_time( $is_gmt = false ) {
return $this->_current_time[(int)( (bool)$is_gmt )];
}
/**
* Returns the associative array of date patterns supported by the plugin.
*
* Currently the formats are:
* array(
* 'def' => 'd/m/yyyy',
* 'us' => 'm/d/yyyy',
* 'iso' => 'yyyy-m-d',
* 'dot' => 'm.d.yyyy',
* );
*
* 'd' or 'dd' represent the day, 'm' or 'mm' represent the month, and 'yy'
* or 'yyyy' represent the year.
*
* @return array List of supported date patterns.
*/
public function get_date_patterns() {
return array(
'def' => 'd/m/yyyy',
'us' => 'm/d/yyyy',
'iso' => 'yyyy-m-d',
'dot' => 'm.d.yyyy',
);
}
/**
* Get acceptable date format.
*
* Returns the date pattern (in the form 'd-m-yyyy', for example) associated
* with the provided key, used by plugin settings. Simply a static map as
* follows:
*
* @param string $key Key for the date format.
*
* @return string Associated date format pattern.
*/
public function get_date_pattern_by_key( $key = 'def' ) {
$patterns = $this->get_date_patterns();
if ( ! isset( $patterns[$key] ) ) {
return (string)current( $patterns );
}
return $patterns[$key];
}
/**
* Format timestamp into URL safe, user selected representation.
*
* Returns a formatted date given a timestamp, based on the given date
* format, with any '/' characters replaced with URL-friendly '-'
* characters.
*
* @see Ai1ec_Date_System::get_date_patterns() for supported date formats.
*
* @param int $timestamp UNIX timestamp representing a date.
* @param string $pattern Key of date pattern (@see
* self::get_date_format_patter()) to
* format date with
*
* @return string Formatted date string.
*/
public function format_date_for_url( $timestamp, $pattern = 'def' ) {
$date = $this->format_date( $timestamp, $pattern );
$date = str_replace( '/', '-', $date );
return $date;
}
/**
* Similar to {@see format_date_for_url} just using new DateTime interface.
*
* @param Ai1ec_Date_Time $datetime Instance of datetime to format.
* @param string $pattern Target format to use.
*
* @return string Formatted datetime string.
*/
public function format_datetime_for_url(
Ai1ec_Date_Time $datetime,
$pattern = 'def'
) {
$date = $datetime->format( $this->get_date_format_patter( $pattern ) );
return str_replace( '/', '-', $date );
}
/**
* Returns the date formatted with new pattern from a given date and old pattern.
*
* @see self::get_date_patterns() for supported date formats.
*
* @param string $date Formatted date string
* @param string $old_pattern Key of old date pattern (@see
* self::get_date_format_patter())
* @param string $new_pattern Key of new date pattern (@see
* self::get_date_format_patter())
* @return string Formatted date string with new pattern
*/
public function convert_date_format( $date, $old_pattern, $new_pattern ) {
// Convert old date to timestamp
$timeArray = date_parse_from_format( $this->get_date_format_patter( $old_pattern ), $date );
$timestamp = mktime(
$timeArray['hour'], $timeArray['minute'], $timeArray['second'],
$timeArray['month'], $timeArray['day'], $timeArray['year']
);
// Convert to new date pattern
return $this->format_date( $timestamp, $new_pattern );
}
/**
* Returns a formatted date given a timestamp, based on the given date format.
*
* @see self::get_date_patterns() for supported date formats.
*
* @param int $timestamp UNIX timestamp representing a date (in GMT)
* @param string $pattern Key of date pattern (@see
* self::get_date_format_patter()) to
* format date with
* @return string Formatted date string
*/
public function format_date( $timestamp, $pattern = 'def' ) {
return gmdate( $this->get_date_format_patter( $pattern ), $timestamp );
}
public function get_date_format_patter( $requested ) {
$pattern = $this->get_date_pattern_by_key( $requested );
$pattern = str_replace(
array( 'dd', 'd', 'mm', 'm', 'yyyy', 'yy' ),
array( 'd', 'j', 'm', 'n', 'Y', 'y' ),
$pattern
);
return $pattern;
}
/**
* Returns human-readable version of the GMT offset.
*
* @param string $timezone_name Olsen Timezone name [optional=null]
*
* @return string GMT offset expression
*/
public function get_gmt_offset_expr( $timezone_name = null ) {
$timezone = $this->get_gmt_offset( $timezone_name );
$offset_h = (int)( $timezone / 60 );
$offset_m = absint( $timezone - $offset_h * 60 );
$timezone = sprintf(
Ai1ec_I18n::__( 'GMT%+d:%02d' ),
$offset_h,
$offset_m
);
return $timezone;
}
/**
* Get current GMT offset in seconds.
*
* @param string $timezone_name Olsen Timezone name [optional=null]
*
* @return int Offset from GMT in seconds.
*/
public function get_gmt_offset( $timezone_name = null ) {
if ( null === $timezone_name ) {
$timezone_name = 'sys.default';
}
$current = $this->_registry->get(
'date.time',
'now',
$timezone_name
);
return $current->get_gmt_offset();
}
/**
* gmgetdate method
*
* Get date/time information in GMT
*
* @param int $timestamp Timestamp at which information shall be evaluated
*
* @return array Associative array of information related to the timestamp
*/
public function gmgetdate( $timestamp = NULL ) {
if ( NULL === $timestamp ) {
$timestamp = isset( $_SERVER['REQUEST_TIME'] ) ? (int)$_SERVER['REQUEST_TIME'] : time();
}
if ( NULL === ( $date = $this->_gmtdates->get( $timestamp ) ) ) {
$particles = explode(
',',
gmdate( 's,i,G,j,w,n,Y,z,l,F,U', $timestamp )
);
$date = array_combine(
array(
'seconds',
'minutes',
'hours',
'mday',
'wday',
'mon',
'year',
'yday',
'weekday',
'month',
0
),
$particles
);
$this->_gmtdates->set( $timestamp, $date );
}
return $date;
}
/**
* Returns current rounded time as unix integer.
*
* @param int $shift Shift value.
*
* @return int Unix timestamp.
*/
public function get_current_rounded_time( $shift = 11 ) {
return $this->current_time() >> $shift << $shift;
}
}