<?php
/**
* @package DATA
*/
/**
* ANSI SQL Datetime data type representation.
*
* When inboxing, if the date or time is invalid,
* {@link DATA_InvalidDatetime} is thrown.
*/
class DATA_SQLDatetime extends DATA_SQLType {
/**
* The date year.
* @var int
*/
protected $year;
/**
* The date month.
* @var int
*/
protected $month;
/**
* The date day.
* @var int
*/
protected $day;
/**
* The time hour.
* @var int
*/
protected $hour;
/**
* The time minutes.
* @var int
*/
protected $minutes;
/**
* The time seconds.
* @var int
*/
protected $seconds;
/**
* Builds a Date data type with the specified year, month and day, or todays date if not specified.
*
* Throws {@link DATA_InvalidDatetime}.
*
* @param boolean $nullable True if the type is nullable.
* @param int $year The date year. Optional.
* @param int $month The date month. Optional.
* @param int $day The date day. Optional.
* @param int $hour The time hour.
* @param int $minutes The time minutes.
* @param int $seconds The time seconds.
*/
public function __construct($nullable, $year = null, $month = null, $day = null,
$hour = null, $minutes = null, $seconds = null) {
parent::__construct($nullable, is_null($year) || is_null($month) || is_null($day)
|| is_null($hour) || is_null($minutes) || is_null($seconds));
if (!$this->isNull()) {
$this->setDate($year, $month, $day);
$this->setTime($hour, $minutes, $seconds);
}
}
/**
* Returns a time object with now's time.
*
* @return DATA_SQLDatetime Now's time.
*/
public static function now() {
$now = time();
$year = (int)date("Y", $now);
$month = (int)date("n", $now);
$day = (int)date("j", $now);
$hour = (int)date("G", $now);
$minutes = (int)date("i", $now);
$seconds = (int)date("s", $now);
return new DATA_SQLDatetime(true, $year, $month, $day, $hour, $minutes, $seconds);
}
/**
* Returns the date year.
*
* @return int The date year.
*/
public function getYear() {
return $this->year;
}
/**
* Sets the date year.
*
* Throws {@link DATA_InvalidDatetime}.
*
* @param int $year The date year.
*/
public function setYear($year) {
$this->setDate($year, $this->month, $this->day);
}
/**
* Returns the date month.
*
* @return int The date month.
*/
public function getMonth() {
return $this->month;
}
/**
* Sets the date month.
*
* Throws {@link DATA_InvalidDatetime}.
*
* @param int $year The date month.
*/
public function setMonth($month) {
$this->setDate($this->year, $month, $this->day);
}
/**
* Returns the date day.
*
* @return int The date day.
*/
public function getDay() {
return $this->day;
}
/**
* Sets the date day.
*
* Throws {@link DATA_InvalidDatetime}.
*
* @param int $year The date day.
*/
public function setDay($day) {
$this->setDate($this->year, $this->month, $day);
}
/**
* Returns the time hour.
*
* @return int The time hour.
*/
public function getHour() {
return $this->hour;
}
/**
* Sets the time hour.
*
* Throws {@link DATA_InvalidDatetime}.
*
* @param int $year The time hour.
*/
public function setHour($hour) {
$this->setTime($hour, $this->minutes, $this->seconds);
}
/**
* Returns the time minutes.
*
* @return int The time minutes.
*/
public function getMinutes() {
return $this->month;
}
/**
* Sets the time minutes.
*
* Throws {@link DATA_InvalidDatetime}.
*
* @param int $year The time minutes.
*/
public function setMinutes($minutes) {
$this->setTime($this->hour, $minutes, $this->seconds);
}
/**
* Returns the time seconds.
*
* @return int The time seconds.
*/
public function getSeconds() {
return $this->day;
}
/**
* Sets the time seconds.
*
* Throws {@link DATA_InvalidDatetime}.
*
* @param int $year The time seconds.
*/
public function setSeconds($seconds) {
$this->setTime($this->hour, $this->minutes, $seconds);
}
/**
* Sets all the date values (year, month, day).
*
* Throws {@link DATA_InvalidDatetime}.
*
* @param int $year The date year.
* @param int $month The date month.
* @param int $day The date day.
*/
public function setDate($year, $month, $day) {
if (!$this->checkDate($year, $month, $day)) {
throw new DATA_InvalidDatetime("$year-$month-$day");
}
$this->year = $year;
$this->month = $month;
$this->day = $day;
$this->setNotNull();
}
/**
* Sets all the time values (hour, minutes, seconds).
*
* Throws {@link DATA_InvalidDatetime}.
*
* @param int $hour The time hour.
* @param int $minutes The time minutes.
* @param int $seconds The time seconds.
*/
public function setTime($hour, $minutes, $seconds) {
if (!$this->checkTime($hour, $minutes, $seconds)) {
throw new DATA_InvalidDatetime("$hour:$minutes:$seconds");
}
$this->hour = $hour;
$this->minutes = $minutes;
$this->seconds = $seconds;
$this->setNotNull();
}
public function setNull() {
parent::setNull();
$this->year = null;
$this->month = null;
$this->day = null;
$this->hour = null;
$this->minutes = null;
$this->seconds = null;
}
public function __toString() {
return str_pad($this->year, 4, '0', STR_PAD_LEFT) . '-'
. str_pad($this->month, 2, '0', STR_PAD_LEFT) . '-'
. str_pad($this->day, 2, '0', STR_PAD_LEFT)
. ' '
. str_pad($this->hour, 2, '0', STR_PAD_LEFT) . ':'
. str_pad($this->minutes, 2, '0', STR_PAD_LEFT) . ':'
. str_pad($this->seconds, 2, '0', STR_PAD_LEFT);
}
/**
* Checks if a given date is valid.
*
* @param int $year The date year.
* @param int $month The date month.
* @param int $day The date day.
* @return bool True if the date is valid.
*/
protected function checkDate($year, $month, $day) {
if ($month > 12 || $month < 1) {
return false;
}
if ($day > self::daysOfMonth($year, $month) || $day < 1) {
return false;
}
return true;
}
/**
* Returns how many days a month has.
*
* @param int $year The date year.
* @param int $month The date month.
* @return int Days in the month.
*/
protected static function daysOfMonth($year, $month) {
return (int) date('t', strtotime("$year-$month-01"));
}
/**
* Checks if a given time is valid.
*
* @param int $hour The time hour.
* @param int $minutes The time minutes.
* @param int $seconds The time seconds.
* @return bool True if the time is valid.
*/
protected function checkTime($hour, $minutes, $seconds) {
if ($hour >= 24 || $hour < 0) {
return false;
}
if ($minutes >= 60 || $minutes < 0) {
return false;
}
if ($seconds >= 60 || $seconds < 0) {
return false;
}
return true;
}
}
?>
|