<?php
namespace Cake\Chronos\Traits;
use DateTimeInterface;
trait FrozenTimeTrait
{
use RelativeKeywordTrait;
protected function stripTime($time)
{
if (is_int($time) || ctype_digit($time)) {
return gmdate('Y-m-d 00:00:00', $time);
}
if ($time instanceof DateTimeInterface) {
$time = $time->format('Y-m-d 00:00:00');
}
if (substr($time, 0, 1) === '@') {
return gmdate('Y-m-d 00:00:00', substr($time, 1));
}
if ($time === null || $time === 'now' || $time === '') {
return date('Y-m-d 00:00:00');
}
if ($this->hasRelativeKeywords($time)) {
return date('Y-m-d 00:00:00', strtotime($time));
}
return preg_replace('/\d{1,2}:\d{1,2}:\d{1,2}(?:\.\d+)?/', '00:00:00', $time);
}
protected function stripRelativeTime($time)
{
return preg_replace('/([-+]\s*\d+\s(?:minutes|seconds|hours|microseconds))/', '', $time);
}
public function setTime($hours, $minutes, $seconds = null, $microseconds = null)
{
if (CHRONOS_SUPPORTS_MICROSECONDS) {
return parent::setTime(0, 0, 0, 0);
}
return parent::setTime(0, 0, 0);
}
public function add($interval)
{
return parent::add($interval)->setTime(0, 0, 0);
}
public function sub($interval)
{
return parent::sub($interval)->setTime(0, 0, 0);
}
public function timezone($value)
{
return $this;
}
public function tz($value)
{
return $this;
}
public function setTimezone($value)
{
return $this;
}
public function setTimestamp($value)
{
return parent::setTimestamp($value)->setTime(0, 0, 0);
}
public function modify($relative)
{
if (preg_match('/hour|minute|second/', $relative)) {
return $this;
}
$new = parent::modify($relative);
if ($new->format('H:i:s') !== '00:00:00') {
return $new->setTime(0, 0, 0);
}
return $new;
}
}