@ 2019-11-11T11:36:50Z <?php
namespace Core\component\time;
final class TimeFactory {
/** @var int */
private $year;
/** @var int */
private $weekNumber;
/** @var int */
private $day;
/** @var int */
private $hour;
/** @var int */
private $minute;
/**
* @param string $formatted
* @return static
*/
public static function createFromString(string $formatted): self {
if (!preg_match('/^(\d{4}):(\d{2}):(\d{1}):(\d{2}):(\d{2})$/', $formatted, $matches)) {
throw new \InvalidArgumentException('Invalid currency format.');
}
return new self(...array_slice($matches, 1));
}
/**
* TimeFactory constructor.
* @param int $year
* @param int $weekNumber
* @param int $day
* @param int $hour
* @param int $minute
*/
public function __construct(int $year, int $weekNumber, int $day, int $hour, int $minute)
{
$this->year = $year;
$this->weekNumber = $weekNumber;
$this->day = $day;
$this->hour = $hour;
$this->minute = $minute;
}
/**
* @param int $addedYears
* @return bool
*/
public function addYears(int $addedYears): bool {
$newYears = $this->year + $addedYears;
if($newYears > 9999) {
return false;
} else {
$this->year += $newYears;
}
return true;
}
/**
* @param int $addedWeeks
*/
public function addWeeks(int $addedWeeks): void {
$newWeeks = $this->weekNumber + $addedWeeks;
if($newWeeks >= 52) {
$years = round($newWeeks / 52, 0, PHP_ROUND_HALF_DOWN);
$this->addYears($years);
}
$this->weekNumber += $newWeeks % 52;
}
/**
* @param int $addedDays
*/
public function addDays(int $addedDays): void {
$newDays = $this->day + $addedDays;
if($newDays >= 7) {
$weeks = round($newDays / 7, 0, PHP_ROUND_HALF_DOWN);
$this->addWeeks($weeks);
}
$this->day += $newDays % 7;
}
/**
* @param int $addedHours
*/
public function addHours(int $addedHours): void {
$newHours = $this->hour + $addedHours;
if($newHours >= 24) {
$days = round($newHours / 24, 0, PHP_ROUND_HALF_DOWN);
$this->addDays($days);
}
$this->hour += $newHours % 24;
}
/**
* @param int $addedMinutes
*/
public function addMinutes(int $addedMinutes): void {
$newMinutes = $this->minute + $addedMinutes;
if($newMinutes >= 60) {
$hours = round($newMinutes / 60, 0, PHP_ROUND_HALF_DOWN);
$this->addHours($hours);
}
$this->minute += $newMinutes % 60;
}
/**
* @return int
*/
public function getYears(): int {
return $this->year;
}
/**
* @return int
*/
public function getWeeks(): int {
return $this->weekNumber;
}
/**
* @return int
*/
public function getDays(): int {
return $this->day;
}
/**
* @return int
*/
public function getHours(): int {
return $this->hour;
}
/**
* @return int
*/
public function getMinutes(): int {
return $this->minute;
}
public function reduceTime(Int $amount, String $type) : bool {
switch($type) {
case "m":
if($this->getMinutes() >= $amount) {
$this->minute -= $amount;
return true;
} else {
if($this->getHours() > 0) {
$this->hour -= 1;
$minutesToAdd = 60 - $amount;
$this->addMinutes($minutesToAdd);
return true;
} elseif ($this->getDays() > 0) {
$this->day -= 1;
$hoursToAdd = 23;
$minutesToAdd = 60 - $amount;
$this->addHours($hoursToAdd);
$this->addMinutes($minutesToAdd);
return true;
} elseif ($this->getWeeks() > 0) {
$this->weekNumber -= 1;
$daysToAdd = 6;
$hoursToAdd = 23;
$minutesToAdd = 60 - $amount;
$this->addDays($daysToAdd);
$this->addHours($hoursToAdd);
$this->addMinutes($minutesToAdd);
return true;
} elseif ($this->getYears() > 0) {
$this->year -= 1;
$weeksToAdd = 51;
$daysToAdd = 6;
$hoursToAdd = 23;
$minutesToAdd = 60 - $amount;
$this->addWeeks($weeksToAdd);
$this->addDays($daysToAdd);
$this->addHours($hoursToAdd);
$this->addMinutes($minutesToAdd);
return true;
}
}
break;
case "h":
if($this->getHours() >= $amount) {
$this->hour -= $amount;
return true;
} else {
if ($this->getDays() > 0) {
$this->day -= 1;
$hoursToAdd = 24 - $amount;
$this->addHours($hoursToAdd);
return true;
} elseif ($this->getWeeks() > 0) {
$this->weekNumber -= 1;
$daysToAdd = 6;
$hoursToAdd = 24 - $amount;
$this->addDays($daysToAdd);
$this->addHours($hoursToAdd);
return true;
} elseif ($this->getYears() > 0) {
$this->year -= 1;
$weeksToAdd = 51;
$daysToAdd = 6;
$hoursToAdd = 24 - $amount;
$this->addWeeks($weeksToAdd);
$this->addDays($daysToAdd);
$this->addHours($hoursToAdd);
return true;
}
}
break;
case "d":
if($this->getDays() >= $amount) {
$this->day -= $amount;
return true;
} else {
if ($this->getWeeks() > 0) {
$this->weekNumber--;
$daysToAdd = 7 - $amount;
$this->addDays($daysToAdd);
return true;
} elseif ($this->getYears() > 0) {
$this->year--;
$weeksToAdd = 51;
$daysToAdd = 7 - $amount;
$this->addWeeks($weeksToAdd);
$this->addDays($daysToAdd);
return true;
}
}
break;
case "w":
if($this->getWeeks() >= $amount) {
$this->weekNumber -= $amount;
return true;
} else {
if ($this->getYears() > 0) {
$weeksToAdd = 52 - $amount;
$this->addWeeks($weeksToAdd);
return true;
}
}
break;
case "y":
if($this->getYears() >= $amount) {
$this->year -= $amount;
return true;
}
}
return false;
}
/**
* @return string
*/
public function __toString(): string {
return sprintf('%04d:%02d:%d:%02d:%02d', $this->year, $this->weekNumber, $this->day, $this->hour, $this->minute);
}
}
$factory = TimeFactory::createFromString("0000:00:0:00:00");
$factory->addMinutes(2);
$factory->addMinutes(4);
$factory->addMinutes(6);
$factory->addMinutes(8);
$factory->addMinutes(10);
$factory->addMinutes(12);
echo $factory;
echo "\n" . $factory->getMinutes();
echo "\n" . $factory->getHours();
echo "\n" . $factory->getDays();
echo "\n" . $factory->getWeeks();
echo "\n" . $factory->getYears();
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Output for 7.1.25 - 7.1.33 , 7.2.0 - 7.2.33 , 7.3.0 - 7.3.33 , 7.4.4 - 7.4.33 , 8.0.0 - 8.0.30 , 8.1.0 - 8.1.28 , 8.2.0 - 8.2.18 , 8.3.0 - 8.3.4 , 8.3.6 0000:00:0:03:60
60
3
0
0
0 Output for 8.3.5 Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
0000:00:0:03:60
60
3
0
0
0 preferences:dark mode live preview
170.84 ms | 402 KiB | 179 Q