Skip to content

Commit

Permalink
DateTime and DateInterval updates
Browse files Browse the repository at this point in the history
  • Loading branch information
Giovanni Lovato committed Sep 28, 2013
1 parent 7f2cc0c commit a71fef2
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 35 deletions.
70 changes: 35 additions & 35 deletions src/Bread/Types/DateInterval.php
Expand Up @@ -3,28 +3,55 @@

class DateInterval extends \DateInterval
{

public function __construct($intervalSpecification)
{
parent::__construct($intervalSpecification);
self::normalize($this);
static::normalize($this);
}
public function getTotalSeconds()

public function toSeconds()
{
return self::calculateSeconds($this);
return static::getSeconds($this);
}

public static function getSeconds(\DateInterval $interval)
{
return ($interval->y * 365 * 24 * 60 * 60) + ($interval->m * 30 * 24 * 60 * 60) + ($interval->d * 24 * 60 * 60) + ($interval->h * 60 * 60) + ($interval->i * 60) + ($interval->s);
}

public static function normalize(\DateInterval $interval)
{
$seconds = static::getSeconds($interval);
$interval->y = floor($seconds / 60 / 60 / 24 / 365);
$seconds -= $interval->y * 31536000;
$interval->m = floor($seconds / 60 / 60 / 24 / 30);
$seconds -= $interval->m * 2592000;
$interval->d = floor($seconds / 60 / 60 / 24);
$seconds -= $interval->d * 86400;
$interval->h = floor($seconds / 60 / 60);
$seconds -= $interval->h * 3600;
$interval->i = floor($seconds / 60);
$seconds -= $interval->i * 60;
$interval->s = $seconds;
}

public static function createFromDateString($time)
{
$interval = parent::createFromDateString($time);
$intervalSpecification = self::getIntervalSpecification($interval);
return new DateInterval($intervalSpecification);
return static::createFromDateInterval($interval);
}

public static function createFromDateInterval(\DateInterval $interval)
{
$intervalSpecification = static::getIntervalSpecification($interval);
return new static($intervalSpecification);
}

public static function getIntervalSpecification(\DateInterval $interval)
{
self::normalize($interval);
$intervalSpecification = 'P';
$intervalSpecification = '';
if ($interval->y) {
$intervalSpecification .= $interval->y . 'Y';
}
Expand All @@ -46,33 +73,6 @@ public static function getIntervalSpecification(\DateInterval $interval)
if ($interval->s) {
$intervalSpecification .= $interval->s . 'S';
}
return $intervalSpecification;
}

public static function calculateSeconds(\DateInterval $interval)
{
return
($interval->y * 365 * 24 * 60 * 60) +
($interval->m * 30 * 24 * 60 * 60) +
($interval->d * 24 * 60 * 60) +
($interval->h * 60 * 60) +
($interval->i * 60) +
($interval->s);
}

public static function normalize(\DateInterval $interval)
{
$seconds = self::calculateSeconds($interval);
$interval->y = floor($seconds / 60 / 60 / 24 / 365);
$seconds -= $interval->y * 31536000;
$interval->m = floor($seconds / 60 / 60 / 24 / 30);
$seconds -= $interval->m * 2592000;
$interval->d = floor($seconds / 60 / 60 / 24);
$seconds -= $interval->d * 86400;
$interval->h = floor($seconds / 60 / 60);
$seconds -= $interval->h * 3600;
$interval->i = floor($seconds / 60);
$seconds -= $interval->i * 60;
$interval->s = $seconds;
return $intervalSpecification ? 'P' . $intervalSpecification : null;
}
}
30 changes: 30 additions & 0 deletions src/Bread/Types/DateTime.php
@@ -1 +1,31 @@
<?php
namespace Bread\Types;

use DateTimeZone;

class DateTime extends \DateTime
{

public function diff($datetime, $absolute = null)
{
$interval = parent::diff($datetime, $absolute);
return DateInterval::createFromDateInterval($interval);
}

public static function __set_state(array $array)
{
$datetime = parent::__set_state($array);
return static::createFromDateTime($datetime);
}

public static function createFromFormat($format, $time, $timezone = null)
{
$datetime = call_user_func_array(array('parent', 'createFromFormat'), func_get_args());
return static::createFromDateTime($datetime);
}

public static function createFromDateTime($datetime)
{
return new static($datetime->format('Y-m-d H:i:s'), $datetime->getTimezone());
}
}

0 comments on commit a71fef2

Please sign in to comment.