%PDF- %PDF-
| Direktori : /home1/lightco1/public_html/lightingrepublic.com.au/libraries/koowa/date/ |
| Current File : //home1/lightco1/public_html/lightingrepublic.com.au/libraries/koowa/date/date.php |
<?php
/**
* @version $Id$
* @package Koowa_Date
* @copyright Copyright (C) 2007 - 2012 Johan Janssens. All rights reserved.
* @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html>
* @link http://www.nooku.org
*/
/**
* "YYYY-MM-DD HH:MM:SS"
*/
define('DATE_FORMAT_ISO', 1);
/**
* "YYYYMMSSTHHMMSS(Z|(+/-)HHMM)?"
*/
define('DATE_FORMAT_ISO_BASIC', 2);
/**
* "YYYY-MM-SSTHH:MM:SS(Z|(+/-)HH:MM)?"
*/
define('DATE_FORMAT_ISO_EXTENDED', 3);
/**
* "YYYY-MM-SSTHH:MM:SS(.S*)?(Z|(+/-)HH:MM)?"
*/
define('DATE_FORMAT_ISO_EXTENDED_MICROTIME', 6);
/**
* "YYYYMMDDHHMMSS"
*/
define('DATE_FORMAT_TIMESTAMP', 4);
/**
* long int, seconds since the unix epoch
*/
define('DATE_FORMAT_UNIXTIME', 5);
define( 'SECONDS_IN_HOUR', 3600 );
define( 'SECONDS_IN_DAY', 86400 );
/**
* Date object
*
* This class draws heavily on PEAR:Date Copyright (c) 1997-2005 Baba Buehler,
* Pierre-Alain Joye Released under the New BSD license
*
* @author Johan Janssens <johan@nooku.org>
* @package Koowa_Date
* @uses KObject
*/
class KDate extends KObject
{
/**
* The year
*
* @var int
*/
public $year;
/**
* The month
*
* @var int
*/
public $month;
/**
* The day
*
* @var int
*/
public $day;
/**
* The hour
*
* @var int
*/
public $hour;
/**
* The minute
*
* @var int
*/
public $minute;
/**
* The second
*
* @var int
*/
public $second;
/**
* Part second
*
* @var float
*/
public $partsecond;
/**
* Constructor
*
* Creates a new Date Object initialized to the current date/time in the
* system-default timezone by default. A date optionally
* passed in may be in the ISO 8601, TIMESTAMP or UNIXTIME format,
* or another Date object. If no date is passed, the current date/time
* is used.
*
* @see setDate()
* @param object An optional KConfig object with configuration options
Recognized key values include 'date'
* @return KDate The new Date object
*/
public function __construct( KConfig $config = null)
{
//If no config is passed create it
if(!isset($config)) $config = new KConfig();
parent::__construct($config);
if ($config->date instanceof KDate) {
$this->copy( $config->date );
} else {
$this->setDate( $config->date );
}
}
/**
* Initializes the options for the object
*
* Called from {@link __construct()} as a first step of object instantiation.
*
* @param object An optional KConfig object with configuration options.
* @return void
*/
protected function _initialize(KConfig $config)
{
$config->append(array(
'date' => date( 'Y-m-d H:i:s' )
));
parent::_initialize($config);
}
/**
* Set the fields of a Date object based on the input date and format
*
* Set the fields of a Date object based on the input date and format,
* which is specified by the DATE_FORMAT_* constants.
*
* @param string $date input date
* @param int $format Optional format constant (DATE_FORMAT_*) of the input date.
* This parameter isn't really needed anymore, but you could
* use it to force DATE_FORMAT_UNIXTIME.
* @return KDate
*/
public function setDate( $date, $format = DATE_FORMAT_ISO )
{
$regex = '/^(\d{4})-?(\d{2})-?(\d{2})([T\s]?(\d{2}):?(\d{2}):?(\d{2})(\.\d+)?(Z|[\+\-]\d{2}:?\d{2})?)?$/i';
if (preg_match( $regex, $date, $regs ) && $format != DATE_FORMAT_UNIXTIME)
{
$this->year = $regs[1];
$this->month = $regs[2];
$this->day = $regs[3];
$this->hour = isset( $regs[5] ) ? $regs[5] : 0;
$this->minute = isset( $regs[6] ) ? $regs[6] : 0;
$this->second = isset( $regs[7] ) ? $regs[7] : 0;
$this->partsecond = (float) isset( $regs[8] ) ? $regs[8] : 0;
}
elseif (is_numeric( $date ))
{
// UNIXTIME
$this->setDate( date( 'Y-m-d H:i:s', $date ) );
}
else
{
// unknown format
$this->year = 0;
$this->month = 1;
$this->day = 1;
$this->hour = 0;
$this->minute = 0;
$this->second = 0;
$this->partsecond = (float)0;
}
return $this;
}
/**
* Get a string (or other) representation of this date
*
* Get a string (or other) representation of this date in the
* format specified by the DATE_FORMAT_* constants.
*
* @param int $format format constant (DATE_FORMAT_*) of the output date
* @return string the date in the requested format
*/
public function getDate( $format = DATE_FORMAT_ISO )
{
switch ($format)
{
case DATE_FORMAT_ISO:
return $this->format( '%Y-%m-%d %H:%M:%S' );
break;
case DATE_FORMAT_ISO_BASIC:
$format = '%Y%m%dT%H%M%S';
return $this->format($format);
break;
case DATE_FORMAT_ISO_EXTENDED:
$format = '%Y-%m-%dT%H:%M:%S';
return $this->format($format);
break;
case DATE_FORMAT_ISO_EXTENDED_MICROTIME:
$format = '%Y-%m-%dT%H:%M:%s';
return $this->format($format);
break;
case DATE_FORMAT_TIMESTAMP:
return $this->format( '%Y%m%d%H%M%S' );
break;
case DATE_FORMAT_UNIXTIME:
return mktime( $this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year );
break;
default:
return $this->format( $format );
break;
}
}
/**
* Copy values from another Date object
*
* Makes this Date a copy of another Date object.
*
* @param object Date $date Date to copy from
*/
public function copy( $date )
{
$this->year = $date->year;
$this->month = $date->month;
$this->day = $date->day;
$this->hour = $date->hour;
$this->minute = $date->minute;
$this->second = $date->second;
}
/**
* Formats the date
*/
public function format( $format )
{
$timestamp = mktime( $this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year );
return strftime( $format, $timestamp );
}
public function getTimestamp()
{
$timestamp = mktime( $this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year );
return $timestamp;
}
/**
* Set the year field of the date object
*
* @param int the year
* @return int the year
*/
public function year( $value = null )
{
if ($value !== null)
{
if ($value < 0 || $value > 9999) {
$this->year = 0;
} else {
$this->year = $value;
}
}
return $this->year;
}
/**
* Set the month field of the date object
*
* @param int the month
* @return int the month
*/
public function month( $value = null )
{
if ($value !== null)
{
if ($value < 1 || $value > 12) {
$this->month = 1;
} else {
$this->month = $value;
}
}
return $this->month;
}
/**
* Set the day field of the date object
*
* @param int the day
* @return int the day
*/
public function day( $value = null )
{
if ($value !== null)
{
if ($value > 31 || $value < 1) {
$this->day = 1;
} else {
$this->day = $value;
}
}
return $this->day;
}
/**
* Set the hour field of the date object
*
* @param int the hour
* @return int the hour
*/
public function hour( $value = null )
{
if ($value !== null)
{
if ($value > 23 || $value < 0) {
$this->hour = 0;
} else {
$this->hour = $value;
}
}
return $this->hour;
}
/**
* Set the minute field of the date object
*
* @param int the minute
* @return int the minute
*/
public function minute( $value = null )
{
if ($value !== null)
{
if ($value > 59 || $value < 0) {
$this->minute = 0;
} else {
$this->minute = $value;
}
}
return $this->minute;
}
/**
* Set the second field of the date object
*
* @param int the second
* @return int the second
*/
public function second( $value = null )
{
if ($value !== null)
{
if ($value > 59 || $value < 0) {
$this->second = 0;
} else {
$this->second = $value;
}
}
return $this->second;
}
/**
* Adds (+/-) a number of years to the current date.
*
* @return KDate
*/
public function addYears( $n )
{
$this->year += $n;
return $this;
}
/**
* Adds (+/-) a number of months to the current date.
*
* @param int Positive or negative number of months
* @return KDate
*/
public function addMonths( $n )
{
$an = abs( $n );
$years = floor( $an / 12 );
$months = $an % 12;
if ($n < 0)
{
$this->year -= $years;
$this->month -= $months;
if ($this->month < 1) {
$this->year--;
$this->month = 12 + $this->month;
}
}
else
{
$this->year += $years;
$this->month += $months;
if ($this->month > 12) {
$this->year++;
$this->month -= 12;
}
}
return $this;
}
/**
* Adds (+/-) a number of days to the current date.
*
* @param int The number of days
* @return KDate
*/
public function addDays( $n )
{
$this->setDate( $this->getTimestamp() + SECONDS_IN_DAY * $n, DATE_FORMAT_UNIXTIME );
return $this;
}
/**
* Adds (+/-) a number of hours to the current date.
*
* @param int The number of days
* @return KDate
*/
public function addHours( $n )
{
$this->setDate( $this->getTimestamp() + SECONDS_IN_HOUR * $n, DATE_FORMAT_UNIXTIME );
return $this;
}
/**
* Adds (+/-) a number of minutes to the current date.
*
* @param int The number of days
* @return KDate
*/
public function addMinutes( $n )
{
$this->setDate( $this->getTimestamp() + 60 * $n, DATE_FORMAT_UNIXTIME );
return $this;
}
/**
* Adds (+/-) a number of seconds to the current date.
*
* @param int The number of days
* @return KDate
*/
public function addSeconds( $n )
{
$this->setDate( $this->getTimestamp() + $n, DATE_FORMAT_UNIXTIME );
return $this;
}
/**
* Converts a date to number of days since a distant unspecified epoch
*
* @param int the day of the month
* @param int the month
* @param int the year. Use the complete year instead of the abbreviated
* version. E.g. use 2005, not 05. Do not add leading 0's for years prior to
* 1000.
*
* @return integer the number of days since the epoch
*/
public function toDays( KDate $date = null)
{
$year = isset($date) ? $date->year : $this->year;
$month = isset($date) ? $date->month : $this->month;
$day = isset($date) ? $date->day : $this->day;
$century = (int) substr( $year, 0, 2 );
$year = (int) substr( $year, 2, 2 );
if ($month > 2) {
$month -= 3;
} else {
$month += 9;
if ($year) {
$year--;
} else {
$year = 99;
$century--;
}
}
return (
floor( (146097 * $century) / 4 ) +
floor( (1461 * $year) / 4 ) +
floor( (153 * $month + 2) / 5 ) +
$day + 1721119);
}
/**
* Returns day of week for given date (0 = Sunday)
*
* @param KDate
* @return int the number of the day in the week
*/
public function getDayOfWeek( KDate $date = null)
{
$year = isset($date) ? $date->year : $this->year;
$month = isset($date) ? $date->month : $this->month;
$day = isset($date) ? $date->day : $this->day;
if ($month > 2) {
$month -= 2;
} else {
$month += 10;
$year--;
}
$day = (floor((13 * $month - 1) / 5) +
$day + ($year % 100) +
floor(($year % 100) / 4) +
floor(($year / 100) / 4) - 2 *
floor($year / 100) + 77);
$weekday_number = $day - 7 * floor($day / 7);
return $weekday_number;
}
/**
* Returns the full weekday name for the given date
*
* @param mixed $day KDate or the weekday number (0-6)
* @return string the full name of the day of the week
*/
public static function getWeekdayFullname( $day = null )
{
if ($day === null ) {
$day = new KDate();
}
if ($day instanceof KDate ) {
$weekday = self::getDayOfWeek( $day );
} else if (is_int( $day )) {
$weekday = $day;
}
$names = self::getWeekDays();
return $names[$weekday];
}
/**
* Returns the abbreviated weekday name for the given date
*
* @param int $date the date object
* @param int $length the length of abbreviation
*
* @return string the abbreviated name of the day of the week
* @see Date_Calc::getWeekdayFullname()
*/
public static function getWeekdayAbbrname( $day, $length = 3)
{
return substr( self::getWeekdayFullname( $day ), 0, $length );
}
/**
* Returns the full month name for the given month
*
* @param int $month the month
*
* @return string the full name of the month
*/
public static function getMonthFullname( $month )
{
$month = (int) $month;
$names = self::getMonthNames();
return $names[$month];
}
/**
* Returns the abbreviated month name for the given month
*
* @param int $month the month
* @param int $length the length of abbreviation
*
* @return string the abbreviated name of the month
* @see Date_Calc::getMonthFullname
*/
public static function getMonthAbbrname($month, $length = 3)
{
$month = (int) $month;
return substr(self::getMonthFullname($month), 0, $length);
}
/**
* Returns an array of month names
*
* Used to take advantage of the setlocale function to return
* language specific month names.
*
* @returns array an array of month names
*/
public static function getMonthNames()
{
static $months;
if(!isset($months))
{
$months = array();
for ($i = 1; $i < 13; $i++) {
$months[$i] = strftime('%B', mktime(0, 0, 0, $i, 1, 2001));
}
}
return $months;
}
/**
* Returns an array of week days
*
* Used to take advantage of the setlocale function to
* return language specific week days.
*
* @returns array an array of week day names
*/
public static function getWeekDays()
{
static $weekdays = null;
if ($weekdays == null)
{
$weekdays = array();
for ($i = 0; $i < 7; $i++) {
$weekdays[$i] = strftime('%A', mktime(0, 0, 0, 1, $i, 2001));
}
}
return $weekdays;
}
/**
* Find the number of days in the given month
*
* @param int $month the month
* @param int $year the year in four digit format
* @return int the number of days the month has
*/
public static function getDaysInMonth($month, $year)
{
if ($year == 1582 && $month == 10) {
return 21; // October 1582 only had 1st-4th and 15th-31st
}
if ($month == 2) {
if (self::isLeapYear($year)) {
return 29;
} else {
return 28;
}
} elseif ($month == 4 or $month == 6 or $month == 9 or $month == 11) {
return 30;
} else {
return 31;
}
}
/**
* Returns true for a leap year, else false
*
* @param int $year the year. Use the complete year instead of the
* abbreviated version. E.g. use 2005, not 05.
* Do not add leading 0's for years prior to 1000.
* @return boolean
*/
public static function isLeapYear( $year )
{
if (preg_match('/\D/', $year)) {
return false;
}
if ($year < 1000) {
return false;
}
if ($year < 1582) {
// pre Gregorio XIII - 1582
return ($year % 4 == 0);
} else {
// post Gregorio XIII - 1582
return (($year % 4 == 0) && ($year % 100 != 0)) || ($year % 400 == 0);
}
}
/**
* @param KDate
* @return boolean
*/
public static function isToday( KDate $date )
{
static $today;
if (!isset($today)) {
$today = new KDate;
}
return ($today->day == $date->day && $today->month == $date->month && $today->year == $date->year);
}
}