vendor
This commit is contained in:
212
vendor/cakephp/chronos/src/Chronos.php
vendored
Normal file
212
vendor/cakephp/chronos/src/Chronos.php
vendored
Normal file
@@ -0,0 +1,212 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
namespace Cake\Chronos;
|
||||
|
||||
use DateTimeImmutable;
|
||||
use DateTimeZone;
|
||||
|
||||
/**
|
||||
* An Immutable extension on the native DateTime object.
|
||||
*
|
||||
* Adds a number of convenience APIs methods and the ability
|
||||
* to easily convert into a mutable object.
|
||||
*
|
||||
* @property-read int $year
|
||||
* @property-read int $yearIso
|
||||
* @property-read int $month
|
||||
* @property-read int $day
|
||||
* @property-read int $hour
|
||||
* @property-read int $minute
|
||||
* @property-read int $second
|
||||
* @property-read int $timestamp seconds since the Unix Epoch
|
||||
* @property-read DateTimeZone $timezone the current timezone
|
||||
* @property-read DateTimeZone $tz alias of timezone
|
||||
* @property-read int $micro
|
||||
* @property-read int $dayOfWeek 1 (for Monday) through 7 (for Sunday)
|
||||
* @property-read int $dayOfYear 0 through 365
|
||||
* @property-read int $weekOfMonth 1 through 5
|
||||
* @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday
|
||||
* @property-read int $daysInMonth number of days in the given month
|
||||
* @property-read int $age does a diffInYears() with default parameters
|
||||
* @property-read int $quarter the quarter of this instance, 1 - 4
|
||||
* @property-read int $offset the timezone offset in seconds from UTC
|
||||
* @property-read int $offsetHours the timezone offset in hours from UTC
|
||||
* @property-read bool $dst daylight savings time indicator, true if DST, false otherwise
|
||||
* @property-read bool $local checks if the timezone is local, true if local, false otherwise
|
||||
* @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise
|
||||
* @property-read string $timezoneName
|
||||
* @property-read string $tzName
|
||||
*/
|
||||
class Chronos extends DateTimeImmutable implements ChronosInterface
|
||||
{
|
||||
use Traits\ComparisonTrait;
|
||||
use Traits\DifferenceTrait;
|
||||
use Traits\FactoryTrait;
|
||||
use Traits\FormattingTrait;
|
||||
use Traits\MagicPropertyTrait;
|
||||
use Traits\ModifierTrait;
|
||||
use Traits\RelativeKeywordTrait;
|
||||
use Traits\TimezoneTrait;
|
||||
|
||||
/**
|
||||
* A test ChronosInterface instance to be returned when now instances are created
|
||||
*
|
||||
* There is a single test now for all date/time classes provided by Chronos.
|
||||
* This aims to emulate stubbing out 'now' which is a single global fact.
|
||||
*
|
||||
* @var \Cake\Chronos\ChronosInterface
|
||||
*/
|
||||
protected static $testNow;
|
||||
|
||||
/**
|
||||
* Format to use for __toString method when type juggling occurs.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected static $toStringFormat = ChronosInterface::DEFAULT_TO_STRING_FORMAT;
|
||||
|
||||
/**
|
||||
* Create a new Chronos instance.
|
||||
*
|
||||
* Please see the testing aids section (specifically static::setTestNow())
|
||||
* for more on the possibility of this constructor returning a test instance.
|
||||
*
|
||||
* @param string|null $time Fixed or relative time
|
||||
* @param \DateTimeZone|string|null $tz The timezone for the instance
|
||||
*/
|
||||
public function __construct($time = 'now', $tz = null)
|
||||
{
|
||||
if ($tz !== null) {
|
||||
$tz = $tz instanceof DateTimeZone ? $tz : new DateTimeZone($tz);
|
||||
}
|
||||
|
||||
static::$_lastErrors = [];
|
||||
$testNow = static::getTestNow();
|
||||
if ($testNow === null) {
|
||||
parent::__construct($time === null ? 'now' : $time, $tz);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$relative = static::hasRelativeKeywords($time);
|
||||
if (!empty($time) && $time !== 'now' && !$relative) {
|
||||
parent::__construct($time, $tz);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$testNow = clone $testNow;
|
||||
if ($relative) {
|
||||
$testNow = $testNow->modify($time);
|
||||
}
|
||||
|
||||
$relativetime = static::isTimeExpression($time);
|
||||
if (!$relativetime && $tz !== $testNow->getTimezone()) {
|
||||
$testNow = $testNow->setTimezone($tz === null ? date_default_timezone_get() : $tz);
|
||||
}
|
||||
|
||||
$time = $testNow->format('Y-m-d H:i:s.u');
|
||||
parent::__construct($time, $tz);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new mutable instance from current immutable instance.
|
||||
*
|
||||
* @return \Cake\Chronos\MutableDateTime
|
||||
*/
|
||||
public function toMutable()
|
||||
{
|
||||
return MutableDateTime::instance($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a copy of the instance
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function copy()
|
||||
{
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a ChronosInterface instance (real or mock) to be returned when a "now"
|
||||
* instance is created. The provided instance will be returned
|
||||
* specifically under the following conditions:
|
||||
* - A call to the static now() method, ex. ChronosInterface::now()
|
||||
* - When a null (or blank string) is passed to the constructor or parse(), ex. new Chronos(null)
|
||||
* - When the string "now" is passed to the constructor or parse(), ex. new Chronos('now')
|
||||
* - When a string containing the desired time is passed to ChronosInterface::parse()
|
||||
*
|
||||
* Note the timezone parameter was left out of the examples above and
|
||||
* has no affect as the mock value will be returned regardless of its value.
|
||||
*
|
||||
* To clear the test instance call this method using the default
|
||||
* parameter of null.
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface|string|null $testNow The instance to use for all future instances.
|
||||
* @return void
|
||||
*/
|
||||
public static function setTestNow($testNow = null)
|
||||
{
|
||||
static::$testNow = is_string($testNow) ? static::parse($testNow) : $testNow;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the ChronosInterface instance (real or mock) to be returned when a "now"
|
||||
* instance is created.
|
||||
*
|
||||
* @return \Cake\Chronos\ChronosInterface The current instance used for testing
|
||||
*/
|
||||
public static function getTestNow()
|
||||
{
|
||||
return static::$testNow;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if there is a valid test instance set. A valid test instance
|
||||
* is anything that is not null.
|
||||
*
|
||||
* @return bool True if there is a test instance, otherwise false
|
||||
*/
|
||||
public static function hasTestNow()
|
||||
{
|
||||
return static::$testNow !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return properties for debugging.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function __debugInfo()
|
||||
{
|
||||
// Conditionally add properties if state exists to avoid
|
||||
// errors when using a debugger.
|
||||
$vars = get_object_vars($this);
|
||||
|
||||
$properties = [
|
||||
'hasFixedNow' => static::hasTestNow(),
|
||||
];
|
||||
|
||||
if (isset($vars['date'])) {
|
||||
$properties['time'] = $this->format('Y-m-d H:i:s.u');
|
||||
}
|
||||
|
||||
if (isset($vars['timezone'])) {
|
||||
$properties['timezone'] = $this->getTimezone()->getName();
|
||||
}
|
||||
|
||||
return $properties;
|
||||
}
|
||||
}
|
||||
1254
vendor/cakephp/chronos/src/ChronosInterface.php
vendored
Normal file
1254
vendor/cakephp/chronos/src/ChronosInterface.php
vendored
Normal file
File diff suppressed because it is too large
Load Diff
526
vendor/cakephp/chronos/src/ChronosInterval.php
vendored
Normal file
526
vendor/cakephp/chronos/src/ChronosInterval.php
vendored
Normal file
@@ -0,0 +1,526 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
namespace Cake\Chronos;
|
||||
|
||||
use DateInterval;
|
||||
use InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* A simple API extension for DateInterval.
|
||||
* The implementation provides helpers to handle weeks but only days are saved.
|
||||
* Weeks are calculated based on the total days of the current instance.
|
||||
*
|
||||
* @property int $years Total years of the current interval.
|
||||
* @property int $months Total months of the current interval.
|
||||
* @property int $weeks Total weeks of the current interval calculated from the days.
|
||||
* @property int $dayz Total days of the current interval (weeks * 7 + days).
|
||||
* @property int $hours Total hours of the current interval.
|
||||
* @property int $minutes Total minutes of the current interval.
|
||||
* @property int $seconds Total seconds of the current interval.
|
||||
*
|
||||
* @property-read int $dayzExcludeWeeks Total days remaining in the final week of the current instance (days % 7).
|
||||
* @property-read int $daysExcludeWeeks alias of dayzExcludeWeeks
|
||||
*
|
||||
* @method static ChronosInterval years($years = 1) Create instance specifying a number of years.
|
||||
* @method static ChronosInterval year($years = 1) Alias for years
|
||||
* @method static ChronosInterval months($months = 1) Create instance specifying a number of months.
|
||||
* @method static ChronosInterval month($months = 1) Alias for months
|
||||
* @method static ChronosInterval weeks($weeks = 1) Create instance specifying a number of weeks.
|
||||
* @method static ChronosInterval week($weeks = 1) Alias for weeks
|
||||
* @method static ChronosInterval days($days = 1) Create instance specifying a number of days.
|
||||
* @method static ChronosInterval dayz($days = 1) Alias for days
|
||||
* @method static ChronosInterval day($days = 1) Alias for days
|
||||
* @method static ChronosInterval hours($hours = 1) Create instance specifying a number of hours.
|
||||
* @method static ChronosInterval hour($hours = 1) Alias for hours
|
||||
* @method static ChronosInterval minutes($minutes = 1) Create instance specifying a number of minutes.
|
||||
* @method static ChronosInterval minute($minutes = 1) Alias for minutes
|
||||
* @method static ChronosInterval seconds($seconds = 1) Create instance specifying a number of seconds.
|
||||
* @method static ChronosInterval second($seconds = 1) Alias for seconds
|
||||
*
|
||||
* @method ChronosInterval years() years($years = 1) Set the years portion of the current interval.
|
||||
* @method ChronosInterval year() year($years = 1) Alias for years.
|
||||
* @method ChronosInterval months() months($months = 1) Set the months portion of the current interval.
|
||||
* @method ChronosInterval month() month($months = 1) Alias for months.
|
||||
* @method ChronosInterval weeks() weeks($weeks = 1) Set the weeks portion of the current interval. Will overwrite dayz value.
|
||||
* @method ChronosInterval week() week($weeks = 1) Alias for weeks.
|
||||
* @method ChronosInterval days() days($days = 1) Set the days portion of the current interval.
|
||||
* @method ChronosInterval dayz() dayz($days = 1) Alias for days.
|
||||
* @method ChronosInterval day() day($days = 1) Alias for days.
|
||||
* @method ChronosInterval hours() hours($hours = 1) Set the hours portion of the current interval.
|
||||
* @method ChronosInterval hour() hour($hours = 1) Alias for hours.
|
||||
* @method ChronosInterval minutes() minutes($minutes = 1) Set the minutes portion of the current interval.
|
||||
* @method ChronosInterval minute() minute($minutes = 1) Alias for minutes.
|
||||
* @method ChronosInterval seconds() seconds($seconds = 1) Set the seconds portion of the current interval.
|
||||
* @method ChronosInterval second() second($seconds = 1) Alias for seconds.
|
||||
*/
|
||||
class ChronosInterval extends DateInterval
|
||||
{
|
||||
/**
|
||||
* Interval spec period designators
|
||||
*/
|
||||
const PERIOD_PREFIX = 'P';
|
||||
const PERIOD_YEARS = 'Y';
|
||||
const PERIOD_MONTHS = 'M';
|
||||
const PERIOD_DAYS = 'D';
|
||||
const PERIOD_TIME_PREFIX = 'T';
|
||||
const PERIOD_HOURS = 'H';
|
||||
const PERIOD_MINUTES = 'M';
|
||||
const PERIOD_SECONDS = 'S';
|
||||
|
||||
/**
|
||||
* Before PHP 5.4.20/5.5.4 instead of `false` days will be set to -99999 when the interval instance
|
||||
* was created by DateTime:diff().
|
||||
*/
|
||||
const PHP_DAYS_FALSE = -99999;
|
||||
|
||||
/**
|
||||
* Whether or not this object was created in HHVM
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $isHHVM = false;
|
||||
|
||||
/**
|
||||
* Determine if the interval was created via DateTime:diff() or not.
|
||||
*
|
||||
* @param \DateInterval $interval The interval to check.
|
||||
* @return bool
|
||||
*/
|
||||
protected static function wasCreatedFromDiff(DateInterval $interval)
|
||||
{
|
||||
return ($interval->days !== false && $interval->days !== static::PHP_DAYS_FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new ChronosInterval instance.
|
||||
*
|
||||
* @param int|null $years The year to use.
|
||||
* @param int|null $months The month to use.
|
||||
* @param int|null $weeks The week to use.
|
||||
* @param int|null $days The day to use.
|
||||
* @param int|null $hours The hours to use.
|
||||
* @param int|null $minutes The minutes to use.
|
||||
* @param int|null $seconds The seconds to use.
|
||||
*/
|
||||
public function __construct($years = 1, $months = null, $weeks = null, $days = null, $hours = null, $minutes = null, $seconds = null)
|
||||
{
|
||||
$this->isHHVM = defined('HHVM_VERSION');
|
||||
$spec = static::PERIOD_PREFIX;
|
||||
|
||||
$spec .= $years > 0 ? $years . static::PERIOD_YEARS : '';
|
||||
$spec .= $months > 0 ? $months . static::PERIOD_MONTHS : '';
|
||||
|
||||
$specDays = 0;
|
||||
$specDays += $weeks > 0 ? $weeks * ChronosInterface::DAYS_PER_WEEK : 0;
|
||||
$specDays += $days > 0 ? $days : 0;
|
||||
|
||||
$spec .= ($specDays > 0) ? $specDays . static::PERIOD_DAYS : '';
|
||||
|
||||
if ($spec === static::PERIOD_PREFIX) {
|
||||
$spec .= '0' . static::PERIOD_YEARS;
|
||||
}
|
||||
|
||||
if ($hours > 0 || $minutes > 0 || $seconds > 0) {
|
||||
$spec .= static::PERIOD_TIME_PREFIX;
|
||||
$spec .= $hours > 0 ? $hours . static::PERIOD_HOURS : '';
|
||||
$spec .= $minutes > 0 ? $minutes . static::PERIOD_MINUTES : '';
|
||||
$spec .= $seconds > 0 ? $seconds . static::PERIOD_SECONDS : '';
|
||||
}
|
||||
|
||||
parent::__construct($spec);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new ChronosInterval instance from specific values.
|
||||
* This is an alias for the constructor that allows better fluent
|
||||
* syntax as it allows you to do ChronosInterval::create(1)->fn() rather than
|
||||
* (new ChronosInterval(1))->fn().
|
||||
*
|
||||
* @param int|null $years The year to use.
|
||||
* @param int|null $months The month to use.
|
||||
* @param int|null $weeks The week to use.
|
||||
* @param int|null $days The day to use.
|
||||
* @param int|null $hours The hours to use.
|
||||
* @param int|null $minutes The minutes to use.
|
||||
* @param int|null $seconds The seconds to use.
|
||||
* @return static
|
||||
*/
|
||||
public static function create($years = 1, $months = null, $weeks = null, $days = null, $hours = null, $minutes = null, $seconds = null)
|
||||
{
|
||||
return new static($years, $months, $weeks, $days, $hours, $minutes, $seconds);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide static helpers to create instances. Allows:
|
||||
*
|
||||
* ```
|
||||
* ChronosInterval::years(3)
|
||||
* // or
|
||||
* ChronosInterval::month(1);
|
||||
* ```
|
||||
*
|
||||
* Note: This is done using the magic method to allow static and instance methods to
|
||||
* have the same names.
|
||||
*
|
||||
* @param string $name The property to configure. Accepts singular and plural forms.
|
||||
* @param array $args Contains the value to use.
|
||||
* @return static
|
||||
*/
|
||||
public static function __callStatic($name, $args)
|
||||
{
|
||||
$arg = count($args) === 0 ? 1 : $args[0];
|
||||
|
||||
switch ($name) {
|
||||
case 'years':
|
||||
case 'year':
|
||||
return new static($arg);
|
||||
|
||||
case 'months':
|
||||
case 'month':
|
||||
return new static(null, $arg);
|
||||
|
||||
case 'weeks':
|
||||
case 'week':
|
||||
return new static(null, null, $arg);
|
||||
|
||||
case 'days':
|
||||
case 'dayz':
|
||||
case 'day':
|
||||
return new static(null, null, null, $arg);
|
||||
|
||||
case 'hours':
|
||||
case 'hour':
|
||||
return new static(null, null, null, null, $arg);
|
||||
|
||||
case 'minutes':
|
||||
case 'minute':
|
||||
return new static(null, null, null, null, null, $arg);
|
||||
|
||||
case 'seconds':
|
||||
case 'second':
|
||||
return new static(null, null, null, null, null, null, $arg);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a ChronosInterval instance from a DateInterval one. Can not instance
|
||||
* DateInterval objects created from DateTime::diff() as you can't externally
|
||||
* set the $days field.
|
||||
*
|
||||
* @param \DateInterval $di The DateInterval instance to copy.
|
||||
* @throws \InvalidArgumentException
|
||||
* @return static
|
||||
*/
|
||||
public static function instance(DateInterval $di)
|
||||
{
|
||||
if (static::wasCreatedFromDiff($di)) {
|
||||
throw new InvalidArgumentException(
|
||||
"Can not instance a DateInterval object created from DateTime::diff()."
|
||||
);
|
||||
}
|
||||
|
||||
$instance = new static($di->y, $di->m, 0, $di->d, $di->h, $di->i, $di->s);
|
||||
$instance->invert = $di->invert;
|
||||
$instance->days = $di->days;
|
||||
|
||||
return $instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a part of the ChronosInterval object
|
||||
*
|
||||
* @param string $name The property to read.
|
||||
* @throws \InvalidArgumentException
|
||||
* @return int
|
||||
*/
|
||||
public function __get($name)
|
||||
{
|
||||
switch ($name) {
|
||||
case 'years':
|
||||
return $this->isHHVM ? parent::__get('y') : $this->y;
|
||||
|
||||
case 'months':
|
||||
return $this->isHHVM ? parent::__get('m') : $this->m;
|
||||
|
||||
case 'dayz':
|
||||
return $this->isHHVM ? parent::__get('d') : $this->d;
|
||||
|
||||
case 'hours':
|
||||
return $this->isHHVM ? parent::__get('h') : $this->h;
|
||||
|
||||
case 'minutes':
|
||||
return $this->isHHVM ? parent::__get('i') : $this->i;
|
||||
|
||||
case 'seconds':
|
||||
return $this->isHHVM ? parent::__get('s') : $this->s;
|
||||
|
||||
case 'weeks':
|
||||
return (int)floor(($this->isHHVM ? parent::__get('d') : $this->d) / ChronosInterface::DAYS_PER_WEEK);
|
||||
|
||||
case 'daysExcludeWeeks':
|
||||
case 'dayzExcludeWeeks':
|
||||
return $this->dayz % ChronosInterface::DAYS_PER_WEEK;
|
||||
case 'days':
|
||||
return $this->isHHVM ? parent::__get('days') : $this->days;
|
||||
case 'y':
|
||||
case 'm':
|
||||
case 'd':
|
||||
case 'h':
|
||||
case 'i':
|
||||
case 's':
|
||||
case 'invert':
|
||||
return parent::__get($name);
|
||||
default:
|
||||
throw new InvalidArgumentException(sprintf("Unknown getter '%s'", $name));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a part of the ChronosInterval object
|
||||
*
|
||||
* @param string $name The property to augment.
|
||||
* @param int $val The value to change.
|
||||
* @return void
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function __set($name, $val)
|
||||
{
|
||||
switch ($name) {
|
||||
case 'years':
|
||||
$this->isHHVM ? parent::__set('y', $val) : $this->y = $val;
|
||||
break;
|
||||
|
||||
case 'months':
|
||||
$this->isHHVM ? parent::__set('m', $val) : $this->m = $val;
|
||||
break;
|
||||
|
||||
case 'weeks':
|
||||
$val = $val * ChronosInterface::DAYS_PER_WEEK;
|
||||
$this->isHHVM ? parent::__set('d', $val) : $this->d = $val;
|
||||
break;
|
||||
|
||||
case 'dayz':
|
||||
$this->isHHVM ? parent::__set('d', $val) : $this->d = $val;
|
||||
break;
|
||||
|
||||
case 'hours':
|
||||
$this->isHHVM ? parent::__set('h', $val) : $this->h = $val;
|
||||
break;
|
||||
|
||||
case 'minutes':
|
||||
$this->isHHVM ? parent::__set('i', $val) : $this->i = $val;
|
||||
break;
|
||||
|
||||
case 'seconds':
|
||||
$this->isHHVM ? parent::__set('s', $val) : $this->s = $val;
|
||||
break;
|
||||
|
||||
case 'invert':
|
||||
$this->isHHVM ? parent::__set('invert', $val) : $this->invert = $val;
|
||||
break;
|
||||
default:
|
||||
if ($this->isHHVM) {
|
||||
parent::__set($name, $val);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow setting of weeks and days to be cumulative.
|
||||
*
|
||||
* @param int $weeks Number of weeks to set
|
||||
* @param int $days Number of days to set
|
||||
* @return static
|
||||
*/
|
||||
public function weeksAndDays($weeks, $days)
|
||||
{
|
||||
$this->dayz = ($weeks * ChronosInterface::DAYS_PER_WEEK) + $days;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow fluent calls on the setters... ChronosInterval::years(3)->months(5)->day().
|
||||
*
|
||||
* Note: This is done using the magic method to allow static and instance methods to
|
||||
* have the same names.
|
||||
*
|
||||
* @param string $name The property name to augment. Accepts plural forms in addition
|
||||
* to singular ones.
|
||||
* @param array $args The value to set.
|
||||
* @return static
|
||||
*/
|
||||
public function __call($name, $args)
|
||||
{
|
||||
$arg = count($args) === 0 ? 1 : $args[0];
|
||||
|
||||
switch ($name) {
|
||||
case 'years':
|
||||
case 'year':
|
||||
$this->years = $arg;
|
||||
break;
|
||||
|
||||
case 'months':
|
||||
case 'month':
|
||||
$this->months = $arg;
|
||||
break;
|
||||
|
||||
case 'weeks':
|
||||
case 'week':
|
||||
$this->dayz = $arg * ChronosInterface::DAYS_PER_WEEK;
|
||||
break;
|
||||
|
||||
case 'days':
|
||||
case 'dayz':
|
||||
case 'day':
|
||||
$this->dayz = $arg;
|
||||
break;
|
||||
|
||||
case 'hours':
|
||||
case 'hour':
|
||||
$this->hours = $arg;
|
||||
break;
|
||||
|
||||
case 'minutes':
|
||||
case 'minute':
|
||||
$this->minutes = $arg;
|
||||
break;
|
||||
|
||||
case 'seconds':
|
||||
case 'second':
|
||||
$this->seconds = $arg;
|
||||
break;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the passed interval to the current instance
|
||||
*
|
||||
* @param \DateInterval $interval The interval to add.
|
||||
* @return static
|
||||
*/
|
||||
public function add(DateInterval $interval)
|
||||
{
|
||||
$sign = ($interval->invert === 1) ? -1 : 1;
|
||||
|
||||
if (static::wasCreatedFromDiff($interval)) {
|
||||
$this->dayz = $this->dayz + ($interval->days * $sign);
|
||||
} else {
|
||||
$this->years = $this->years + ($interval->y * $sign);
|
||||
$this->months = $this->months + ($interval->m * $sign);
|
||||
$this->dayz = $this->dayz + ($interval->d * $sign);
|
||||
$this->hours = $this->hours + ($interval->h * $sign);
|
||||
$this->minutes = $this->minutes + ($interval->i * $sign);
|
||||
$this->seconds = $this->seconds + ($interval->s * $sign);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ISO 8601 interval string.
|
||||
*
|
||||
* @return string Interval as string representation
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
// equivalence
|
||||
$oneMinuteInSeconds = 60;
|
||||
$oneHourInSeconds = $oneMinuteInSeconds * 60;
|
||||
$oneDayInSeconds = $oneHourInSeconds * 24;
|
||||
$oneMonthInDays = 365 / 12;
|
||||
$oneMonthInSeconds = $oneDayInSeconds * $oneMonthInDays;
|
||||
$oneYearInSeconds = 12 * $oneMonthInSeconds;
|
||||
|
||||
// convert
|
||||
$ySecs = $this->y * $oneYearInSeconds;
|
||||
$mSecs = $this->m * $oneMonthInSeconds;
|
||||
$dSecs = $this->d * $oneDayInSeconds;
|
||||
$hSecs = $this->h * $oneHourInSeconds;
|
||||
$iSecs = $this->i * $oneMinuteInSeconds;
|
||||
$sSecs = $this->s;
|
||||
|
||||
$totalSecs = $ySecs + $mSecs + $dSecs + $hSecs + $iSecs + $sSecs;
|
||||
|
||||
$y = null;
|
||||
$m = null;
|
||||
$d = null;
|
||||
$h = null;
|
||||
$i = null;
|
||||
|
||||
// years
|
||||
if ($totalSecs >= $oneYearInSeconds) {
|
||||
$y = floor($totalSecs / $oneYearInSeconds);
|
||||
$totalSecs = $totalSecs - $y * $oneYearInSeconds;
|
||||
}
|
||||
|
||||
// months
|
||||
if ($totalSecs >= $oneMonthInSeconds) {
|
||||
$m = floor($totalSecs / $oneMonthInSeconds);
|
||||
$totalSecs = $totalSecs - $m * $oneMonthInSeconds;
|
||||
}
|
||||
|
||||
// days
|
||||
if ($totalSecs >= $oneDayInSeconds) {
|
||||
$d = floor($totalSecs / $oneDayInSeconds);
|
||||
$totalSecs = $totalSecs - $d * $oneDayInSeconds;
|
||||
}
|
||||
|
||||
// hours
|
||||
if ($totalSecs >= $oneHourInSeconds) {
|
||||
$h = floor($totalSecs / $oneHourInSeconds);
|
||||
$totalSecs = $totalSecs - $h * $oneHourInSeconds;
|
||||
}
|
||||
|
||||
// minutes
|
||||
if ($totalSecs >= $oneMinuteInSeconds) {
|
||||
$i = floor($totalSecs / $oneMinuteInSeconds);
|
||||
$totalSecs = $totalSecs - $i * $oneMinuteInSeconds;
|
||||
}
|
||||
|
||||
$s = $totalSecs;
|
||||
|
||||
$date = array_filter([
|
||||
static::PERIOD_YEARS => $y,
|
||||
static::PERIOD_MONTHS => $m,
|
||||
static::PERIOD_DAYS => $d,
|
||||
]);
|
||||
|
||||
$time = array_filter([
|
||||
static::PERIOD_HOURS => $h,
|
||||
static::PERIOD_MINUTES => $i,
|
||||
static::PERIOD_SECONDS => $s,
|
||||
]);
|
||||
|
||||
$specString = static::PERIOD_PREFIX;
|
||||
|
||||
foreach ($date as $key => $value) {
|
||||
$specString .= $value . $key;
|
||||
}
|
||||
|
||||
if (count($time) > 0) {
|
||||
$specString .= static::PERIOD_TIME_PREFIX;
|
||||
foreach ($time as $key => $value) {
|
||||
$specString .= $value . $key;
|
||||
}
|
||||
}
|
||||
|
||||
if ($specString === static::PERIOD_PREFIX) {
|
||||
return 'PT0S';
|
||||
}
|
||||
|
||||
return $this->invert === 1 ? '-' . $specString : $specString;
|
||||
}
|
||||
}
|
||||
150
vendor/cakephp/chronos/src/Date.php
vendored
Normal file
150
vendor/cakephp/chronos/src/Date.php
vendored
Normal file
@@ -0,0 +1,150 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
namespace Cake\Chronos;
|
||||
|
||||
use DateTimeImmutable;
|
||||
use DateTimeZone;
|
||||
|
||||
/**
|
||||
* An immutable date object that converts all time components into 00:00:00.
|
||||
*
|
||||
* This class is useful when you want to represent a calendar date and ignore times.
|
||||
* This means that timezone changes take no effect as a calendar date exists in all timezones
|
||||
* in each respective date.
|
||||
*
|
||||
* @property-read int $year
|
||||
* @property-read int $yearIso
|
||||
* @property-read int $month
|
||||
* @property-read int $day
|
||||
* @property-read int $hour
|
||||
* @property-read int $minute
|
||||
* @property-read int $second
|
||||
* @property-read int $timestamp seconds since the Unix Epoch
|
||||
* @property-read DateTimeZone $timezone the current timezone
|
||||
* @property-read DateTimeZone $tz alias of timezone
|
||||
* @property-read int $micro
|
||||
* @property-read int $dayOfWeek 1 (for Monday) through 7 (for Sunday)
|
||||
* @property-read int $dayOfYear 0 through 365
|
||||
* @property-read int $weekOfMonth 1 through 5
|
||||
* @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday
|
||||
* @property-read int $daysInMonth number of days in the given month
|
||||
* @property-read int $age does a diffInYears() with default parameters
|
||||
* @property-read int $quarter the quarter of this instance, 1 - 4
|
||||
* @property-read int $offset the timezone offset in seconds from UTC
|
||||
* @property-read int $offsetHours the timezone offset in hours from UTC
|
||||
* @property-read bool $dst daylight savings time indicator, true if DST, false otherwise
|
||||
* @property-read bool $local checks if the timezone is local, true if local, false otherwise
|
||||
* @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise
|
||||
* @property-read string $timezoneName
|
||||
* @property-read string $tzName
|
||||
*/
|
||||
class Date extends DateTimeImmutable implements ChronosInterface
|
||||
{
|
||||
use Traits\ComparisonTrait;
|
||||
use Traits\DifferenceTrait;
|
||||
use Traits\FactoryTrait;
|
||||
use Traits\FormattingTrait;
|
||||
use Traits\FrozenTimeTrait;
|
||||
use Traits\MagicPropertyTrait;
|
||||
use Traits\ModifierTrait;
|
||||
use Traits\TestingAidTrait;
|
||||
|
||||
/**
|
||||
* Format to use for __toString method when type juggling occurs.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected static $toStringFormat = 'Y-m-d';
|
||||
|
||||
/**
|
||||
* Create a new Immutable Date instance.
|
||||
*
|
||||
* Please see the testing aids section (specifically static::setTestNow())
|
||||
* for more on the possibility of this constructor returning a test instance.
|
||||
*
|
||||
* Date instances lack time components, however due to limitations in PHP's
|
||||
* internal Datetime object the time will always be set to 00:00:00, and the
|
||||
* timezone will always be UTC. Normalizing the timezone allows for
|
||||
* subtraction/addition to have deterministic results.
|
||||
*
|
||||
* @param string|null $time Fixed or relative time
|
||||
*/
|
||||
public function __construct($time = 'now')
|
||||
{
|
||||
$tz = new DateTimeZone('UTC');
|
||||
$testNow = Chronos::getTestNow();
|
||||
if ($testNow === null) {
|
||||
$time = $this->stripTime($time);
|
||||
|
||||
parent::__construct($time, $tz);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$relative = static::hasRelativeKeywords($time);
|
||||
if (!empty($time) && $time !== 'now' && !$relative) {
|
||||
$time = $this->stripTime($time);
|
||||
|
||||
parent::__construct($time, $tz);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$testNow = clone $testNow;
|
||||
if ($relative) {
|
||||
$time = $this->stripRelativeTime($time);
|
||||
if (strlen($time) > 0) {
|
||||
$testNow = $testNow->modify($time);
|
||||
}
|
||||
}
|
||||
|
||||
if ($tz !== $testNow->getTimezone()) {
|
||||
$testNow = $testNow->setTimezone($tz === null ? date_default_timezone_get() : $tz);
|
||||
}
|
||||
|
||||
$time = $testNow->format('Y-m-d 00:00:00');
|
||||
parent::__construct($time, $tz);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new mutable instance from current immutable instance.
|
||||
*
|
||||
* @return \Cake\Chronos\MutableDate
|
||||
*/
|
||||
public function toMutable()
|
||||
{
|
||||
return MutableDate::instance($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return properties for debugging.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function __debugInfo()
|
||||
{
|
||||
// Conditionally add properties if state exists to avoid
|
||||
// errors when using a debugger.
|
||||
$vars = get_object_vars($this);
|
||||
|
||||
$properties = [
|
||||
'hasFixedNow' => static::hasTestNow(),
|
||||
];
|
||||
|
||||
if (isset($vars['date'])) {
|
||||
$properties['date'] = $this->format('Y-m-d');
|
||||
}
|
||||
|
||||
return $properties;
|
||||
}
|
||||
}
|
||||
103
vendor/cakephp/chronos/src/DifferenceFormatter.php
vendored
Normal file
103
vendor/cakephp/chronos/src/DifferenceFormatter.php
vendored
Normal file
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
namespace Cake\Chronos;
|
||||
|
||||
/**
|
||||
* Handles formatting differences in text.
|
||||
*
|
||||
* Provides a swappable component for other libraries to leverage.
|
||||
* when localizing or customizing the difference output.
|
||||
*/
|
||||
class DifferenceFormatter
|
||||
{
|
||||
|
||||
/**
|
||||
* The text translator object
|
||||
*
|
||||
* @var \Cake\Chronos\Translator
|
||||
*/
|
||||
protected $translate;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param \Cake\Chronos\Translator|null $translate The text translator object.
|
||||
*/
|
||||
public function __construct($translate = null)
|
||||
{
|
||||
$this->translate = $translate ?: new Translator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the difference in a human readable format.
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface $date The datetime to start with.
|
||||
* @param \Cake\Chronos\ChronosInterface|null $other The datetime to compare against.
|
||||
* @param bool $absolute removes time difference modifiers ago, after, etc
|
||||
* @return string The difference between the two days in a human readable format
|
||||
* @see \Cake\Chronos\ChronosInterface::diffForHumans
|
||||
*/
|
||||
public function diffForHumans(ChronosInterface $date, ChronosInterface $other = null, $absolute = false)
|
||||
{
|
||||
$isNow = $other === null;
|
||||
if ($isNow) {
|
||||
$other = $date->now($date->tz);
|
||||
}
|
||||
$diffInterval = $date->diff($other);
|
||||
|
||||
switch (true) {
|
||||
case ($diffInterval->y > 0):
|
||||
$unit = 'year';
|
||||
$count = $diffInterval->y;
|
||||
break;
|
||||
case ($diffInterval->m > 0):
|
||||
$unit = 'month';
|
||||
$count = $diffInterval->m;
|
||||
break;
|
||||
case ($diffInterval->d > 0):
|
||||
$unit = 'day';
|
||||
$count = $diffInterval->d;
|
||||
if ($count >= ChronosInterface::DAYS_PER_WEEK) {
|
||||
$unit = 'week';
|
||||
$count = (int)($count / ChronosInterface::DAYS_PER_WEEK);
|
||||
}
|
||||
break;
|
||||
case ($diffInterval->h > 0):
|
||||
$unit = 'hour';
|
||||
$count = $diffInterval->h;
|
||||
break;
|
||||
case ($diffInterval->i > 0):
|
||||
$unit = 'minute';
|
||||
$count = $diffInterval->i;
|
||||
break;
|
||||
default:
|
||||
$count = $diffInterval->s;
|
||||
$unit = 'second';
|
||||
break;
|
||||
}
|
||||
$time = $this->translate->plural($unit, $count, ['count' => $count]);
|
||||
if ($absolute) {
|
||||
return $time;
|
||||
}
|
||||
$isFuture = $diffInterval->invert === 1;
|
||||
$transId = $isNow ? ($isFuture ? 'from_now' : 'ago') : ($isFuture ? 'after' : 'before');
|
||||
|
||||
// Some langs have special pluralization for past and future tense.
|
||||
$tryKeyExists = $unit . '_' . $transId;
|
||||
if ($this->translate->exists($tryKeyExists)) {
|
||||
$time = $this->translate->plural($tryKeyExists, $count, ['count' => $count]);
|
||||
}
|
||||
|
||||
return $this->translate->singular($transId, ['time' => $time]);
|
||||
}
|
||||
}
|
||||
149
vendor/cakephp/chronos/src/MutableDate.php
vendored
Normal file
149
vendor/cakephp/chronos/src/MutableDate.php
vendored
Normal file
@@ -0,0 +1,149 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
namespace Cake\Chronos;
|
||||
|
||||
use DateTime;
|
||||
use DateTimeZone;
|
||||
|
||||
/**
|
||||
* A mutable date object that converts all time components into 00:00:00.
|
||||
*
|
||||
* This class is useful when you want to represent a calendar date and ignore times.
|
||||
* This means that timezone changes take no effect as a calendar date exists in all timezones
|
||||
* in each respective date.
|
||||
*
|
||||
* @property-read int $year
|
||||
* @property-read int $yearIso
|
||||
* @property-read int $month
|
||||
* @property-read int $day
|
||||
* @property-read int $hour
|
||||
* @property-read int $minute
|
||||
* @property-read int $second
|
||||
* @property-read int $timestamp seconds since the Unix Epoch
|
||||
* @property-read DateTimeZone $timezone the current timezone
|
||||
* @property-read DateTimeZone $tz alias of timezone
|
||||
* @property-read int $micro
|
||||
* @property-read int $dayOfWeek 1 (for Monday) through 7 (for Sunday)
|
||||
* @property-read int $dayOfYear 0 through 365
|
||||
* @property-read int $weekOfMonth 1 through 5
|
||||
* @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday
|
||||
* @property-read int $daysInMonth number of days in the given month
|
||||
* @property-read int $age does a diffInYears() with default parameters
|
||||
* @property-read int $quarter the quarter of this instance, 1 - 4
|
||||
* @property-read int $offset the timezone offset in seconds from UTC
|
||||
* @property-read int $offsetHours the timezone offset in hours from UTC
|
||||
* @property-read bool $dst daylight savings time indicator, true if DST, false otherwise
|
||||
* @property-read bool $local checks if the timezone is local, true if local, false otherwise
|
||||
* @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise
|
||||
* @property-read string $timezoneName
|
||||
* @property-read string $tzName
|
||||
*/
|
||||
class MutableDate extends DateTime implements ChronosInterface
|
||||
{
|
||||
use Traits\ComparisonTrait;
|
||||
use Traits\DifferenceTrait;
|
||||
use Traits\FactoryTrait;
|
||||
use Traits\FormattingTrait;
|
||||
use Traits\FrozenTimeTrait;
|
||||
use Traits\MagicPropertyTrait;
|
||||
use Traits\ModifierTrait;
|
||||
use Traits\TestingAidTrait;
|
||||
|
||||
/**
|
||||
* Format to use for __toString method when type juggling occurs.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected static $toStringFormat = 'Y-m-d';
|
||||
|
||||
/**
|
||||
* Create a new mutable Date instance.
|
||||
*
|
||||
* Please see the testing aids section (specifically static::setTestNow())
|
||||
* for more on the possibility of this constructor returning a test instance.
|
||||
*
|
||||
* Date instances lack time components, however due to limitations in PHP's
|
||||
* internal Datetime object the time will always be set to 00:00:00, and the
|
||||
* timezone will always be UTC. Normalizing the timezone allows for
|
||||
* subtraction/addition to have deterministic results.
|
||||
*
|
||||
* @param string|null $time Fixed or relative time
|
||||
*/
|
||||
public function __construct($time = 'now')
|
||||
{
|
||||
$tz = new DateTimeZone('UTC');
|
||||
|
||||
$testNow = Chronos::getTestNow();
|
||||
if ($testNow === null) {
|
||||
$time = $this->stripTime($time);
|
||||
parent::__construct($time, $tz);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$relative = static::hasRelativeKeywords($time);
|
||||
if (!empty($time) && $time !== 'now' && !$relative) {
|
||||
$time = $this->stripTime($time);
|
||||
|
||||
parent::__construct($time, $tz);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$testNow = clone $testNow;
|
||||
if ($relative) {
|
||||
$time = $this->stripRelativeTime($time);
|
||||
if (strlen($time) > 0) {
|
||||
$testNow = $testNow->modify($time);
|
||||
}
|
||||
}
|
||||
|
||||
if ($tz !== $testNow->getTimezone()) {
|
||||
$testNow = $testNow->setTimezone($tz === null ? date_default_timezone_get() : $tz);
|
||||
}
|
||||
|
||||
$time = $testNow->format('Y-m-d 00:00:00');
|
||||
parent::__construct($time, $tz);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new immutable instance from current mutable instance.
|
||||
*
|
||||
* @return \Cake\Chronos\Date
|
||||
*/
|
||||
public function toImmutable()
|
||||
{
|
||||
return Date::instance($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return properties for debugging.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function __debugInfo()
|
||||
{
|
||||
// Conditionally add properties if state exists to avoid
|
||||
// errors when using a debugger.
|
||||
$vars = get_object_vars($this);
|
||||
|
||||
$properties = [
|
||||
'hasFixedNow' => static::hasTestNow(),
|
||||
];
|
||||
|
||||
if (isset($vars['date'])) {
|
||||
$properties['date'] = $this->format('Y-m-d');
|
||||
}
|
||||
|
||||
return $properties;
|
||||
}
|
||||
}
|
||||
196
vendor/cakephp/chronos/src/MutableDateTime.php
vendored
Normal file
196
vendor/cakephp/chronos/src/MutableDateTime.php
vendored
Normal file
@@ -0,0 +1,196 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
namespace Cake\Chronos;
|
||||
|
||||
use DateTime;
|
||||
use DateTimeZone;
|
||||
use InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* A mutable datetime instance that implements the ChronosInterface.
|
||||
*
|
||||
* This object can be mutated in place using any setter method,
|
||||
* or __set().
|
||||
*
|
||||
* @property-read int $year
|
||||
* @property-read int $yearIso
|
||||
* @property-read int $month
|
||||
* @property-read int $day
|
||||
* @property-read int $hour
|
||||
* @property-read int $minute
|
||||
* @property-read int $second
|
||||
* @property-read int $timestamp seconds since the Unix Epoch
|
||||
* @property-read DateTimeZone $timezone the current timezone
|
||||
* @property-read DateTimeZone $tz alias of timezone
|
||||
* @property-read int $micro
|
||||
* @property-read int $dayOfWeek 1 (for Monday) through 7 (for Sunday)
|
||||
* @property-read int $dayOfYear 0 through 365
|
||||
* @property-read int $weekOfMonth 1 through 5
|
||||
* @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday
|
||||
* @property-read int $daysInMonth number of days in the given month
|
||||
* @property-read int $age does a diffInYears() with default parameters
|
||||
* @property-read int $quarter the quarter of this instance, 1 - 4
|
||||
* @property-read int $offset the timezone offset in seconds from UTC
|
||||
* @property-read int $offsetHours the timezone offset in hours from UTC
|
||||
* @property-read bool $dst daylight savings time indicator, true if DST, false otherwise
|
||||
* @property-read bool $local checks if the timezone is local, true if local, false otherwise
|
||||
* @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise
|
||||
* @property-read string $timezoneName
|
||||
* @property-read string $tzName
|
||||
*/
|
||||
class MutableDateTime extends DateTime implements ChronosInterface
|
||||
{
|
||||
use Traits\ComparisonTrait;
|
||||
use Traits\DifferenceTrait;
|
||||
use Traits\FactoryTrait;
|
||||
use Traits\FormattingTrait;
|
||||
use Traits\MagicPropertyTrait;
|
||||
use Traits\ModifierTrait;
|
||||
use Traits\RelativeKeywordTrait;
|
||||
use Traits\TestingAidTrait;
|
||||
use Traits\TimezoneTrait;
|
||||
|
||||
/**
|
||||
* Format to use for __toString method when type juggling occurs.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected static $toStringFormat = ChronosInterface::DEFAULT_TO_STRING_FORMAT;
|
||||
|
||||
/**
|
||||
* Create a new MutableDateTime instance.
|
||||
*
|
||||
* Please see the testing aids section (specifically static::setTestNow())
|
||||
* for more on the possibility of this constructor returning a test instance.
|
||||
*
|
||||
* @param string|null $time Fixed or relative time
|
||||
* @param \DateTimeZone|string|null $tz The timezone for the instance
|
||||
*/
|
||||
public function __construct($time = 'now', $tz = null)
|
||||
{
|
||||
if ($tz !== null) {
|
||||
$tz = $tz instanceof DateTimeZone ? $tz : new DateTimeZone($tz);
|
||||
}
|
||||
|
||||
$testNow = Chronos::getTestNow();
|
||||
if ($testNow === null) {
|
||||
parent::__construct($time === null ? 'now' : $time, $tz);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$relative = static::hasRelativeKeywords($time);
|
||||
if (!empty($time) && $time !== 'now' && !$relative) {
|
||||
parent::__construct($time, $tz);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$testNow = clone $testNow;
|
||||
if ($relative) {
|
||||
$testNow = $testNow->modify($time);
|
||||
}
|
||||
|
||||
$relativetime = static::isTimeExpression($time);
|
||||
if (!$relativetime && $tz !== $testNow->getTimezone()) {
|
||||
$testNow = $testNow->setTimezone($tz === null ? date_default_timezone_get() : $tz);
|
||||
}
|
||||
$time = $testNow->format('Y-m-d H:i:s.u');
|
||||
parent::__construct($time, $tz);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new immutable instance from current mutable instance.
|
||||
*
|
||||
* @return Chronos
|
||||
*/
|
||||
public function toImmutable()
|
||||
{
|
||||
return Chronos::instance($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a part of the ChronosInterface object
|
||||
*
|
||||
* @param string $name The property to set.
|
||||
* @param string|int|\DateTimeZone $value The value to set.
|
||||
* @throws \InvalidArgumentException
|
||||
* @return void
|
||||
*/
|
||||
public function __set($name, $value)
|
||||
{
|
||||
switch ($name) {
|
||||
case 'year':
|
||||
$this->year($value);
|
||||
break;
|
||||
|
||||
case 'month':
|
||||
$this->month($value);
|
||||
break;
|
||||
|
||||
case 'day':
|
||||
$this->day($value);
|
||||
break;
|
||||
|
||||
case 'hour':
|
||||
$this->hour($value);
|
||||
break;
|
||||
|
||||
case 'minute':
|
||||
$this->minute($value);
|
||||
break;
|
||||
|
||||
case 'second':
|
||||
$this->second($value);
|
||||
break;
|
||||
|
||||
case 'timestamp':
|
||||
$this->timestamp($value);
|
||||
break;
|
||||
|
||||
case 'timezone':
|
||||
case 'tz':
|
||||
$this->timezone($value);
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new InvalidArgumentException(sprintf("Unknown setter '%s'", $name));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return properties for debugging.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function __debugInfo()
|
||||
{
|
||||
// Conditionally add properties if state exists to avoid
|
||||
// errors when using a debugger.
|
||||
$vars = get_object_vars($this);
|
||||
|
||||
$properties = [
|
||||
'hasFixedNow' => static::hasTestNow(),
|
||||
];
|
||||
|
||||
if (isset($vars['date'])) {
|
||||
$properties['time'] = $this->format('Y-m-d H:i:s.u');
|
||||
}
|
||||
|
||||
if (isset($vars['timezone'])) {
|
||||
$properties['timezone'] = $this->getTimezone()->getName();
|
||||
}
|
||||
|
||||
return $properties;
|
||||
}
|
||||
}
|
||||
499
vendor/cakephp/chronos/src/Traits/ComparisonTrait.php
vendored
Normal file
499
vendor/cakephp/chronos/src/Traits/ComparisonTrait.php
vendored
Normal file
@@ -0,0 +1,499 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
namespace Cake\Chronos\Traits;
|
||||
|
||||
use Cake\Chronos\ChronosInterface;
|
||||
use DateTime;
|
||||
|
||||
/**
|
||||
* Provides various comparison operator methods for datetime objects.
|
||||
*/
|
||||
trait ComparisonTrait
|
||||
{
|
||||
use CopyTrait;
|
||||
|
||||
/**
|
||||
* Days of weekend
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected static $weekendDays = [ChronosInterface::SATURDAY, ChronosInterface::SUNDAY];
|
||||
|
||||
/**
|
||||
* Get weekend days
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getWeekendDays()
|
||||
{
|
||||
return static::$weekendDays;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set weekend days
|
||||
*
|
||||
* @param array $days Which days are 'weekends'.
|
||||
* @return void
|
||||
*/
|
||||
public static function setWeekendDays($days)
|
||||
{
|
||||
static::$weekendDays = $days;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is equal to another
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface $dt The instance to compare with.
|
||||
* @return bool
|
||||
*/
|
||||
public function eq(ChronosInterface $dt)
|
||||
{
|
||||
return $this == $dt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is not equal to another
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface $dt The instance to compare with.
|
||||
* @return bool
|
||||
*/
|
||||
public function ne(ChronosInterface $dt)
|
||||
{
|
||||
return !$this->eq($dt);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is greater (after) than another
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface $dt The instance to compare with.
|
||||
* @return bool
|
||||
*/
|
||||
public function gt(ChronosInterface $dt)
|
||||
{
|
||||
return $this > $dt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is greater (after) than or equal to another
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface $dt The instance to compare with.
|
||||
* @return bool
|
||||
*/
|
||||
public function gte(ChronosInterface $dt)
|
||||
{
|
||||
return $this >= $dt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is less (before) than another
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface $dt The instance to compare with.
|
||||
* @return bool
|
||||
*/
|
||||
public function lt(ChronosInterface $dt)
|
||||
{
|
||||
return $this < $dt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is less (before) or equal to another
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface $dt The instance to compare with.
|
||||
* @return bool
|
||||
*/
|
||||
public function lte(ChronosInterface $dt)
|
||||
{
|
||||
return $this <= $dt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is between two others
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface $dt1 The instance to compare with.
|
||||
* @param \Cake\Chronos\ChronosInterface $dt2 The instance to compare with.
|
||||
* @param bool $equal Indicates if a > and < comparison should be used or <= or >=
|
||||
* @return bool
|
||||
*/
|
||||
public function between(ChronosInterface $dt1, ChronosInterface $dt2, $equal = true)
|
||||
{
|
||||
if ($dt1->gt($dt2)) {
|
||||
$temp = $dt1;
|
||||
$dt1 = $dt2;
|
||||
$dt2 = $temp;
|
||||
}
|
||||
|
||||
if ($equal) {
|
||||
return $this->gte($dt1) && $this->lte($dt2);
|
||||
}
|
||||
|
||||
return $this->gt($dt1) && $this->lt($dt2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the closest date from the instance.
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface $dt1 The instance to compare with.
|
||||
* @param \Cake\Chronos\ChronosInterface $dt2 The instance to compare with.
|
||||
* @return \Cake\Chronos\ChronosInterface
|
||||
*/
|
||||
public function closest(ChronosInterface $dt1, ChronosInterface $dt2)
|
||||
{
|
||||
return $this->diffInSeconds($dt1) < $this->diffInSeconds($dt2) ? $dt1 : $dt2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the farthest date from the instance.
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface $dt1 The instance to compare with.
|
||||
* @param \Cake\Chronos\ChronosInterface $dt2 The instance to compare with.
|
||||
* @return \Cake\Chronos\ChronosInterface
|
||||
*/
|
||||
public function farthest(ChronosInterface $dt1, ChronosInterface $dt2)
|
||||
{
|
||||
return $this->diffInSeconds($dt1) > $this->diffInSeconds($dt2) ? $dt1 : $dt2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the minimum instance between a given instance (default now) and the current instance.
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to compare with.
|
||||
* @return static
|
||||
*/
|
||||
public function min(ChronosInterface $dt = null)
|
||||
{
|
||||
$dt = ($dt === null) ? static::now($this->tz) : $dt;
|
||||
|
||||
return $this->lt($dt) ? $this : $dt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the maximum instance between a given instance (default now) and the current instance.
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to compare with.
|
||||
* @return static
|
||||
*/
|
||||
public function max(ChronosInterface $dt = null)
|
||||
{
|
||||
$dt = ($dt === null) ? static::now($this->tz) : $dt;
|
||||
|
||||
return $this->gt($dt) ? $this : $dt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is a weekday
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isWeekday()
|
||||
{
|
||||
return !$this->isWeekend();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is a weekend day
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isWeekend()
|
||||
{
|
||||
return in_array($this->dayOfWeek, self::$weekendDays, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is yesterday
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isYesterday()
|
||||
{
|
||||
return $this->toDateString() === static::yesterday($this->tz)->toDateString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is today
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isToday()
|
||||
{
|
||||
return $this->toDateString() === static::now($this->tz)->toDateString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is tomorrow
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isTomorrow()
|
||||
{
|
||||
return $this->toDateString() === static::tomorrow($this->tz)->toDateString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is within the next week
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isNextWeek()
|
||||
{
|
||||
return $this->format('W o') === static::now($this->tz)->addWeek()->format('W o');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is within the last week
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isLastWeek()
|
||||
{
|
||||
return $this->format('W o') === static::now($this->tz)->subWeek()->format('W o');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is within the next month
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isNextMonth()
|
||||
{
|
||||
return $this->format('m Y') === static::now($this->tz)->addMonth()->format('m Y');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is within the last month
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isLastMonth()
|
||||
{
|
||||
return $this->format('m Y') === static::now($this->tz)->subMonth()->format('m Y');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is within the next year
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isNextYear()
|
||||
{
|
||||
return $this->year === static::now($this->tz)->addYear()->year;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is within the last year
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isLastYear()
|
||||
{
|
||||
return $this->year === static::now($this->tz)->subYear()->year;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is in the future, ie. greater (after) than now
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isFuture()
|
||||
{
|
||||
return $this->gt(static::now($this->tz));
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is in the past, ie. less (before) than now
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isPast()
|
||||
{
|
||||
return $this->lt(static::now($this->tz));
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the instance is a leap year
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isLeapYear()
|
||||
{
|
||||
return $this->format('L') === '1';
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the passed in date is the same day as the instance current day.
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface $dt The instance to check against.
|
||||
* @return bool
|
||||
*/
|
||||
public function isSameDay(ChronosInterface $dt)
|
||||
{
|
||||
return $this->toDateString() === $dt->toDateString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this day is a Sunday.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isSunday()
|
||||
{
|
||||
return $this->dayOfWeek === ChronosInterface::SUNDAY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this day is a Monday.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isMonday()
|
||||
{
|
||||
return $this->dayOfWeek === ChronosInterface::MONDAY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this day is a Tuesday.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isTuesday()
|
||||
{
|
||||
return $this->dayOfWeek === ChronosInterface::TUESDAY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this day is a Wednesday.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isWednesday()
|
||||
{
|
||||
return $this->dayOfWeek === ChronosInterface::WEDNESDAY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this day is a Thursday.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isThursday()
|
||||
{
|
||||
return $this->dayOfWeek === ChronosInterface::THURSDAY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this day is a Friday.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isFriday()
|
||||
{
|
||||
return $this->dayOfWeek === ChronosInterface::FRIDAY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this day is a Saturday.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isSaturday()
|
||||
{
|
||||
return $this->dayOfWeek === ChronosInterface::SATURDAY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this object represents a date within the current week
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isThisWeek()
|
||||
{
|
||||
return static::now($this->getTimezone())->format('W o') === $this->format('W o');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this object represents a date within the current month
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isThisMonth()
|
||||
{
|
||||
return static::now($this->getTimezone())->format('m Y') === $this->format('m Y');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this object represents a date within the current year
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isThisYear()
|
||||
{
|
||||
return static::now($this->getTimezone())->format('Y') === $this->format('Y');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if its the birthday. Compares the date/month values of the two dates.
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to compare with or null to use current day.
|
||||
* @return static
|
||||
*/
|
||||
public function isBirthday(ChronosInterface $dt = null)
|
||||
{
|
||||
if ($dt === null) {
|
||||
$dt = static::now($this->tz);
|
||||
}
|
||||
|
||||
return $this->format('md') === $dt->format('md');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true this instance happened within the specified interval
|
||||
*
|
||||
* @param string|int $timeInterval the numeric value with space then time type.
|
||||
* Example of valid types: 6 hours, 2 days, 1 minute.
|
||||
* @return bool
|
||||
*/
|
||||
public function wasWithinLast($timeInterval)
|
||||
{
|
||||
$now = new static();
|
||||
$interval = $now->copy()->modify('-' . $timeInterval);
|
||||
$thisTime = $this->format('U');
|
||||
|
||||
return $thisTime >= $interval->format('U') && $thisTime <= $now->format('U');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true this instance will happen within the specified interval
|
||||
*
|
||||
* @param string|int $timeInterval the numeric value with space then time type.
|
||||
* Example of valid types: 6 hours, 2 days, 1 minute.
|
||||
* @return bool
|
||||
*/
|
||||
public function isWithinNext($timeInterval)
|
||||
{
|
||||
$now = new static();
|
||||
$interval = $now->copy()->modify('+' . $timeInterval);
|
||||
$thisTime = $this->format('U');
|
||||
|
||||
return $thisTime <= $interval->format('U') && $thisTime >= $now->format('U');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if instance of ChronosInterface is mutable.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isMutable()
|
||||
{
|
||||
return $this instanceof DateTime;
|
||||
}
|
||||
}
|
||||
31
vendor/cakephp/chronos/src/Traits/CopyTrait.php
vendored
Normal file
31
vendor/cakephp/chronos/src/Traits/CopyTrait.php
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
namespace Cake\Chronos\Traits;
|
||||
|
||||
/**
|
||||
* Provides methods for copying datetime objects.
|
||||
*
|
||||
* Expects that implementing classes provide a static `instance()` method.
|
||||
*/
|
||||
trait CopyTrait
|
||||
{
|
||||
/**
|
||||
* Get a copy of the instance
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function copy()
|
||||
{
|
||||
return static::instance($this);
|
||||
}
|
||||
}
|
||||
302
vendor/cakephp/chronos/src/Traits/DifferenceTrait.php
vendored
Normal file
302
vendor/cakephp/chronos/src/Traits/DifferenceTrait.php
vendored
Normal file
@@ -0,0 +1,302 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
namespace Cake\Chronos\Traits;
|
||||
|
||||
use Cake\Chronos\ChronosInterface;
|
||||
use Cake\Chronos\ChronosInterval;
|
||||
use Cake\Chronos\DifferenceFormatter;
|
||||
use DatePeriod;
|
||||
use DateTimeImmutable;
|
||||
use DateTimeInterface;
|
||||
|
||||
/**
|
||||
* Provides methods for getting differences between datetime objects.
|
||||
*
|
||||
* Expects that the implementing class implements:
|
||||
*
|
||||
* - static::now()
|
||||
* - static::instance()
|
||||
* - copy()
|
||||
*/
|
||||
trait DifferenceTrait
|
||||
{
|
||||
/**
|
||||
* Instance of the diff formatting object.
|
||||
*
|
||||
* @var \Cake\Chronos\DifferenceFormatter
|
||||
*/
|
||||
protected static $diffFormatter;
|
||||
|
||||
/**
|
||||
* Get the difference in years
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
|
||||
* @param bool $abs Get the absolute of the difference
|
||||
* @return int
|
||||
*/
|
||||
public function diffInYears(ChronosInterface $dt = null, $abs = true)
|
||||
{
|
||||
$dt = $dt === null ? static::now($this->tz) : $dt;
|
||||
|
||||
return (int)$this->diff($dt, $abs)->format('%r%y');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the difference in months
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
|
||||
* @param bool $abs Get the absolute of the difference
|
||||
* @return int
|
||||
*/
|
||||
public function diffInMonths(ChronosInterface $dt = null, $abs = true)
|
||||
{
|
||||
$dt = $dt === null ? static::now($this->tz) : $dt;
|
||||
|
||||
return $this->diffInYears($dt, $abs) * ChronosInterface::MONTHS_PER_YEAR + (int)$this->diff($dt, $abs)->format('%r%m');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the difference in weeks
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
|
||||
* @param bool $abs Get the absolute of the difference
|
||||
* @return int
|
||||
*/
|
||||
public function diffInWeeks(ChronosInterface $dt = null, $abs = true)
|
||||
{
|
||||
return (int)($this->diffInDays($dt, $abs) / ChronosInterface::DAYS_PER_WEEK);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the difference in days
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
|
||||
* @param bool $abs Get the absolute of the difference
|
||||
* @return int
|
||||
*/
|
||||
public function diffInDays(ChronosInterface $dt = null, $abs = true)
|
||||
{
|
||||
$dt = $dt === null ? static::now($this->tz) : $dt;
|
||||
|
||||
return (int)$this->diff($dt, $abs)->format('%r%a');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the difference in days using a filter callable
|
||||
*
|
||||
* @param callable $callback The callback to use for filtering.
|
||||
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
|
||||
* @param bool $abs Get the absolute of the difference
|
||||
* @return int
|
||||
*/
|
||||
public function diffInDaysFiltered(callable $callback, ChronosInterface $dt = null, $abs = true)
|
||||
{
|
||||
return $this->diffFiltered(ChronosInterval::day(), $callback, $dt, $abs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the difference in hours using a filter callable
|
||||
*
|
||||
* @param callable $callback The callback to use for filtering.
|
||||
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
|
||||
* @param bool $abs Get the absolute of the difference
|
||||
* @return int
|
||||
*/
|
||||
public function diffInHoursFiltered(callable $callback, ChronosInterface $dt = null, $abs = true)
|
||||
{
|
||||
return $this->diffFiltered(ChronosInterval::hour(), $callback, $dt, $abs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the difference by the given interval using a filter callable
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterval $ci An interval to traverse by
|
||||
* @param callable $callback The callback to use for filtering.
|
||||
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
|
||||
* @param bool $abs Get the absolute of the difference
|
||||
* @return int
|
||||
*/
|
||||
public function diffFiltered(ChronosInterval $ci, callable $callback, ChronosInterface $dt = null, $abs = true)
|
||||
{
|
||||
$start = $this;
|
||||
$end = $dt === null ? static::now($this->tz) : $dt;
|
||||
$inverse = false;
|
||||
|
||||
if (defined('HHVM_VERSION')) {
|
||||
$start = new DateTimeImmutable($this->toIso8601String());
|
||||
$end = new DateTimeImmutable($end->toIso8601String());
|
||||
}
|
||||
|
||||
if ($end < $start) {
|
||||
$start = $end;
|
||||
$end = $this;
|
||||
$inverse = true;
|
||||
}
|
||||
|
||||
$period = new DatePeriod($start, $ci, $end);
|
||||
$vals = array_filter(iterator_to_array($period), function (DateTimeInterface $date) use ($callback) {
|
||||
return $callback(static::instance($date));
|
||||
});
|
||||
|
||||
$diff = count($vals);
|
||||
|
||||
return $inverse && !$abs ? -$diff : $diff;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the difference in weekdays
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
|
||||
* @param bool $abs Get the absolute of the difference
|
||||
* @return int
|
||||
*/
|
||||
public function diffInWeekdays(ChronosInterface $dt = null, $abs = true)
|
||||
{
|
||||
return $this->diffInDaysFiltered(function (ChronosInterface $date) {
|
||||
return $date->isWeekday();
|
||||
}, $dt, $abs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the difference in weekend days using a filter
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
|
||||
* @param bool $abs Get the absolute of the difference
|
||||
* @return int
|
||||
*/
|
||||
public function diffInWeekendDays(ChronosInterface $dt = null, $abs = true)
|
||||
{
|
||||
return $this->diffInDaysFiltered(function (ChronosInterface $date) {
|
||||
return $date->isWeekend();
|
||||
}, $dt, $abs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the difference in hours
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
|
||||
* @param bool $abs Get the absolute of the difference
|
||||
* @return int
|
||||
*/
|
||||
public function diffInHours(ChronosInterface $dt = null, $abs = true)
|
||||
{
|
||||
return (int)($this->diffInSeconds($dt, $abs) / ChronosInterface::SECONDS_PER_MINUTE / ChronosInterface::MINUTES_PER_HOUR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the difference in minutes
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
|
||||
* @param bool $abs Get the absolute of the difference
|
||||
* @return int
|
||||
*/
|
||||
public function diffInMinutes(ChronosInterface $dt = null, $abs = true)
|
||||
{
|
||||
return (int)($this->diffInSeconds($dt, $abs) / ChronosInterface::SECONDS_PER_MINUTE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the difference in seconds
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from.
|
||||
* @param bool $abs Get the absolute of the difference
|
||||
* @return int
|
||||
*/
|
||||
public function diffInSeconds(ChronosInterface $dt = null, $abs = true)
|
||||
{
|
||||
$dt = ($dt === null) ? static::now($this->tz) : $dt;
|
||||
$value = $dt->getTimestamp() - $this->getTimestamp();
|
||||
|
||||
return $abs ? abs($value) : $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* The number of seconds since midnight.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function secondsSinceMidnight()
|
||||
{
|
||||
return $this->diffInSeconds($this->copy()->startOfDay());
|
||||
}
|
||||
|
||||
/**
|
||||
* The number of seconds until 23:59:59.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function secondsUntilEndOfDay()
|
||||
{
|
||||
return $this->diffInSeconds($this->copy()->endOfDay());
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience method for getting the remaining time from a given time.
|
||||
*
|
||||
* @param \DateTime|\DateTimeImmutable $datetime The date to get the remaining time from.
|
||||
* @return \DateInterval|bool The DateInterval object representing the difference between the two dates or FALSE on failure.
|
||||
*/
|
||||
public static function fromNow($datetime)
|
||||
{
|
||||
$timeNow = new static();
|
||||
|
||||
return $timeNow->diff($datetime);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the difference in a human readable format.
|
||||
*
|
||||
* When comparing a value in the past to default now:
|
||||
* 1 hour ago
|
||||
* 5 months ago
|
||||
*
|
||||
* When comparing a value in the future to default now:
|
||||
* 1 hour from now
|
||||
* 5 months from now
|
||||
*
|
||||
* When comparing a value in the past to another value:
|
||||
* 1 hour before
|
||||
* 5 months before
|
||||
*
|
||||
* When comparing a value in the future to another value:
|
||||
* 1 hour after
|
||||
* 5 months after
|
||||
*
|
||||
* @param \Cake\Chronos\ChronosInterface|null $other The datetime to compare with.
|
||||
* @param bool $absolute removes time difference modifiers ago, after, etc
|
||||
* @return string
|
||||
*/
|
||||
public function diffForHumans(ChronosInterface $other = null, $absolute = false)
|
||||
{
|
||||
return static::diffFormatter()->diffForHumans($this, $other, $absolute);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the difference formatter instance or overwrite the current one.
|
||||
*
|
||||
* @param \Cake\Chronos\DifferenceFormatter|null $formatter The formatter instance when setting.
|
||||
* @return \Cake\Chronos\DifferenceFormatter The formatter instance.
|
||||
*/
|
||||
public static function diffFormatter($formatter = null)
|
||||
{
|
||||
if ($formatter === null) {
|
||||
if (static::$diffFormatter === null) {
|
||||
static::$diffFormatter = new DifferenceFormatter();
|
||||
}
|
||||
|
||||
return static::$diffFormatter;
|
||||
}
|
||||
|
||||
return static::$diffFormatter = $formatter;
|
||||
}
|
||||
}
|
||||
280
vendor/cakephp/chronos/src/Traits/FactoryTrait.php
vendored
Normal file
280
vendor/cakephp/chronos/src/Traits/FactoryTrait.php
vendored
Normal file
@@ -0,0 +1,280 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
namespace Cake\Chronos\Traits;
|
||||
|
||||
use DateTimeInterface;
|
||||
use DateTimeZone;
|
||||
use InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* Provides a number of datetime related factory methods.
|
||||
*/
|
||||
trait FactoryTrait
|
||||
{
|
||||
/**
|
||||
* Holds the last error generated by createFromFormat
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected static $_lastErrors = [];
|
||||
|
||||
/**
|
||||
* Create a ChronosInterface instance from a DateTimeInterface one
|
||||
*
|
||||
* @param \DateTimeInterface $dt The datetime instance to convert.
|
||||
* @return static
|
||||
*/
|
||||
public static function instance(DateTimeInterface $dt)
|
||||
{
|
||||
if ($dt instanceof static) {
|
||||
return clone $dt;
|
||||
}
|
||||
|
||||
return new static($dt->format('Y-m-d H:i:s.u'), $dt->getTimezone());
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a ChronosInterface instance from a string. This is an alias for the
|
||||
* constructor that allows better fluent syntax as it allows you to do
|
||||
* ChronosInterface::parse('Monday next week')->fn() rather than
|
||||
* (new Chronos('Monday next week'))->fn()
|
||||
*
|
||||
* @param string $time The strtotime compatible string to parse
|
||||
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name.
|
||||
* @return static
|
||||
*/
|
||||
public static function parse($time = 'now', $tz = null)
|
||||
{
|
||||
return new static($time, $tz);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a ChronosInterface instance for the current date and time
|
||||
*
|
||||
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name.
|
||||
* @return static
|
||||
*/
|
||||
public static function now($tz = null)
|
||||
{
|
||||
return new static('now', $tz);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a ChronosInterface instance for today
|
||||
*
|
||||
* @param \DateTimeZone|string|null $tz The timezone to use.
|
||||
* @return static
|
||||
*/
|
||||
public static function today($tz = null)
|
||||
{
|
||||
return new static('midnight', $tz);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a ChronosInterface instance for tomorrow
|
||||
*
|
||||
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name the new instance should use.
|
||||
* @return static
|
||||
*/
|
||||
public static function tomorrow($tz = null)
|
||||
{
|
||||
return new static('tomorrow, midnight', $tz);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a ChronosInterface instance for yesterday
|
||||
*
|
||||
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name the new instance should use.
|
||||
* @return static
|
||||
*/
|
||||
public static function yesterday($tz = null)
|
||||
{
|
||||
return new static('yesterday, midnight', $tz);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a ChronosInterface instance for the greatest supported date.
|
||||
*
|
||||
* @return \Cake\Chronos\ChronosInterface
|
||||
*/
|
||||
public static function maxValue()
|
||||
{
|
||||
return static::createFromTimestampUTC(PHP_INT_MAX);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a ChronosInterface instance for the lowest supported date.
|
||||
*
|
||||
* @return \Cake\Chronos\ChronosInterface
|
||||
*/
|
||||
public static function minValue()
|
||||
{
|
||||
$max = PHP_INT_SIZE === 4 ? PHP_INT_MAX : PHP_INT_MAX / 10;
|
||||
|
||||
return static::createFromTimestampUTC(~$max);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new ChronosInterface instance from a specific date and time.
|
||||
*
|
||||
* If any of $year, $month or $day are set to null their now() values
|
||||
* will be used.
|
||||
*
|
||||
* If $hour is null it will be set to its now() value and the default values
|
||||
* for $minute and $second will be their now() values.
|
||||
* If $hour is not null then the default values for $minute and $second
|
||||
* will be 0.
|
||||
*
|
||||
* @param int|null $year The year to create an instance with.
|
||||
* @param int|null $month The month to create an instance with.
|
||||
* @param int|null $day The day to create an instance with.
|
||||
* @param int|null $hour The hour to create an instance with.
|
||||
* @param int|null $minute The minute to create an instance with.
|
||||
* @param int|null $second The second to create an instance with.
|
||||
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name the new instance should use.
|
||||
* @return static
|
||||
*/
|
||||
public static function create($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null)
|
||||
{
|
||||
$year = ($year === null) ? date('Y') : $year;
|
||||
$month = ($month === null) ? date('n') : $month;
|
||||
$day = ($day === null) ? date('j') : $day;
|
||||
|
||||
if ($hour === null) {
|
||||
$hour = date('G');
|
||||
$minute = ($minute === null) ? date('i') : $minute;
|
||||
$second = ($second === null) ? date('s') : $second;
|
||||
} else {
|
||||
$minute = ($minute === null) ? 0 : $minute;
|
||||
$second = ($second === null) ? 0 : $second;
|
||||
}
|
||||
|
||||
$instance = static::createFromFormat('Y-n-j G:i:s', sprintf('%s-%s-%s %s:%02s:%02s', 0, $month, $day, $hour, $minute, $second), $tz);
|
||||
|
||||
return $instance->addYears($year);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a ChronosInterface instance from just a date. The time portion is set to now.
|
||||
*
|
||||
* @param int $year The year to create an instance with.
|
||||
* @param int $month The month to create an instance with.
|
||||
* @param int $day The day to create an instance with.
|
||||
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name the new instance should use.
|
||||
* @return static
|
||||
*/
|
||||
public static function createFromDate($year = null, $month = null, $day = null, $tz = null)
|
||||
{
|
||||
return static::create($year, $month, $day, null, null, null, $tz);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a ChronosInterface instance from just a time. The date portion is set to today.
|
||||
*
|
||||
* @param int|null $hour The hour to create an instance with.
|
||||
* @param int|null $minute The minute to create an instance with.
|
||||
* @param int|null $second The second to create an instance with.
|
||||
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name the new instance should use.
|
||||
* @return static
|
||||
*/
|
||||
public static function createFromTime($hour = null, $minute = null, $second = null, $tz = null)
|
||||
{
|
||||
return static::create(null, null, null, $hour, $minute, $second, $tz);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a ChronosInterface instance from a specific format
|
||||
*
|
||||
* @param string $format The date() compatible format string.
|
||||
* @param string $time The formatted date string to interpret.
|
||||
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name the new instance should use.
|
||||
* @return static
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public static function createFromFormat($format, $time, $tz = null)
|
||||
{
|
||||
if ($tz !== null) {
|
||||
$dt = parent::createFromFormat($format, $time, static::safeCreateDateTimeZone($tz));
|
||||
} else {
|
||||
$dt = parent::createFromFormat($format, $time);
|
||||
}
|
||||
|
||||
$errors = parent::getLastErrors();
|
||||
if ($dt == false) {
|
||||
throw new InvalidArgumentException(implode(PHP_EOL, $errors['errors']));
|
||||
}
|
||||
|
||||
$dt = static::instance($dt);
|
||||
static::$_lastErrors = $errors;
|
||||
|
||||
return $dt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a ChronosInterface instance from a timestamp
|
||||
*
|
||||
* @param int $timestamp The timestamp to create an instance from.
|
||||
* @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name the new instance should use.
|
||||
* @return static
|
||||
*/
|
||||
public static function createFromTimestamp($timestamp, $tz = null)
|
||||
{
|
||||
return static::now($tz)->setTimestamp($timestamp);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a ChronosInterface instance from an UTC timestamp
|
||||
*
|
||||
* @param int $timestamp The UTC timestamp to create an instance from.
|
||||
* @return static
|
||||
*/
|
||||
public static function createFromTimestampUTC($timestamp)
|
||||
{
|
||||
return new static('@' . $timestamp);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a DateTimeZone from a string or a DateTimeZone
|
||||
*
|
||||
* @param \DateTimeZone|string|null $object The value to convert.
|
||||
* @return \DateTimeZone
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
protected static function safeCreateDateTimeZone($object)
|
||||
{
|
||||
if ($object === null) {
|
||||
return new DateTimeZone(date_default_timezone_get());
|
||||
}
|
||||
|
||||
if ($object instanceof DateTimeZone) {
|
||||
return $object;
|
||||
}
|
||||
|
||||
return new DateTimeZone($object);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns any errors or warnings that were found during the parsing
|
||||
* of the last object created by this class.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getLastErrors()
|
||||
{
|
||||
if (empty(static::$_lastErrors)) {
|
||||
return parent::getLastErrors();
|
||||
}
|
||||
|
||||
return static::$_lastErrors;
|
||||
}
|
||||
}
|
||||
259
vendor/cakephp/chronos/src/Traits/FormattingTrait.php
vendored
Normal file
259
vendor/cakephp/chronos/src/Traits/FormattingTrait.php
vendored
Normal file
@@ -0,0 +1,259 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
namespace Cake\Chronos\Traits;
|
||||
|
||||
use Cake\Chronos\ChronosInterface;
|
||||
use DateTime;
|
||||
|
||||
/**
|
||||
* Provides string formatting methods for datetime instances.
|
||||
*
|
||||
* Expects implementing classes to define static::$toStringFormat
|
||||
*/
|
||||
trait FormattingTrait
|
||||
{
|
||||
/**
|
||||
* Reset the format used to the default when type juggling a ChronosInterface instance to a string
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function resetToStringFormat()
|
||||
{
|
||||
static::setToStringFormat(ChronosInterface::DEFAULT_TO_STRING_FORMAT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the default format used when type juggling a ChronosInterface instance to a string
|
||||
*
|
||||
* @param string $format The format to use in future __toString() calls.
|
||||
* @return void
|
||||
*/
|
||||
public static function setToStringFormat($format)
|
||||
{
|
||||
static::$toStringFormat = $format;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance as a string using the set format
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return $this->format(static::$toStringFormat);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance as date
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toDateString()
|
||||
{
|
||||
return $this->format('Y-m-d');
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance as a readable date
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toFormattedDateString()
|
||||
{
|
||||
return $this->format('M j, Y');
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance as time
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toTimeString()
|
||||
{
|
||||
return $this->format('H:i:s');
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance as date and time
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toDateTimeString()
|
||||
{
|
||||
return $this->format('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance with day, date and time
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toDayDateTimeString()
|
||||
{
|
||||
return $this->format('D, M j, Y g:i A');
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance as ATOM
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toAtomString()
|
||||
{
|
||||
return $this->format(DateTime::ATOM);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance as COOKIE
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toCookieString()
|
||||
{
|
||||
return $this->format(DateTime::COOKIE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance as ISO8601
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toIso8601String()
|
||||
{
|
||||
return $this->format(DateTime::ATOM);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance as RFC822
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toRfc822String()
|
||||
{
|
||||
return $this->format(DateTime::RFC822);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance as RFC850
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toRfc850String()
|
||||
{
|
||||
return $this->format(DateTime::RFC850);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance as RFC1036
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toRfc1036String()
|
||||
{
|
||||
return $this->format(DateTime::RFC1036);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance as RFC1123
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toRfc1123String()
|
||||
{
|
||||
return $this->format(DateTime::RFC1123);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance as RFC2822
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toRfc2822String()
|
||||
{
|
||||
return $this->format(DateTime::RFC2822);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance as RFC3339
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toRfc3339String()
|
||||
{
|
||||
return $this->format(DateTime::RFC3339);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance as RSS
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toRssString()
|
||||
{
|
||||
return $this->format(DateTime::RSS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the instance as W3C
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toW3cString()
|
||||
{
|
||||
return $this->format(DateTime::W3C);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a UNIX timestamp.
|
||||
*
|
||||
* @return string UNIX timestamp
|
||||
*/
|
||||
public function toUnixString()
|
||||
{
|
||||
return $this->format('U');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the quarter
|
||||
*
|
||||
* @param bool $range Range.
|
||||
* @return int|array 1, 2, 3, or 4 quarter of year or array if $range true
|
||||
*/
|
||||
public function toQuarter($range = false)
|
||||
{
|
||||
$quarter = ceil($this->format('m') / 3);
|
||||
if ($range === false) {
|
||||
return $quarter;
|
||||
}
|
||||
|
||||
$year = $this->format('Y');
|
||||
switch ($quarter) {
|
||||
case 1:
|
||||
return [$year . '-01-01', $year . '-03-31'];
|
||||
case 2:
|
||||
return [$year . '-04-01', $year . '-06-30'];
|
||||
case 3:
|
||||
return [$year . '-07-01', $year . '-09-30'];
|
||||
case 4:
|
||||
return [$year . '-10-01', $year . '-12-31'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function toWeek()
|
||||
{
|
||||
return (int)$this->format('W');
|
||||
}
|
||||
}
|
||||
186
vendor/cakephp/chronos/src/Traits/FrozenTimeTrait.php
vendored
Normal file
186
vendor/cakephp/chronos/src/Traits/FrozenTimeTrait.php
vendored
Normal file
@@ -0,0 +1,186 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
namespace Cake\Chronos\Traits;
|
||||
|
||||
use DateTimeInterface;
|
||||
|
||||
/**
|
||||
* A trait for freezing the time aspect of a DateTime.
|
||||
*
|
||||
* Used in making calendar date objects, both mutable and immutable.
|
||||
*/
|
||||
trait FrozenTimeTrait
|
||||
{
|
||||
use RelativeKeywordTrait;
|
||||
|
||||
/**
|
||||
* Removes the time components from an input string.
|
||||
*
|
||||
* Used to ensure constructed objects always lack time.
|
||||
*
|
||||
* @param string|int $time The input time. Integer values will be assumed
|
||||
* to be in UTC. The 'now' and '' values will use the current local time.
|
||||
* @return string The date component of $time.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove time components from strtotime relative strings.
|
||||
*
|
||||
* @param string $time The input expression
|
||||
* @return string The output expression with no time modifiers.
|
||||
*/
|
||||
protected function stripRelativeTime($time)
|
||||
{
|
||||
return preg_replace('/([-+]\s*\d+\s(?:minutes|seconds|hours|microseconds))/', '', $time);
|
||||
}
|
||||
|
||||
/**
|
||||
* Modify the time on the Date.
|
||||
*
|
||||
* This method ignores all inputs and forces all inputs to 0.
|
||||
*
|
||||
* @param int $hours The hours to set (ignored)
|
||||
* @param int $minutes The minutes to set (ignored)
|
||||
* @param int $seconds The seconds to set (ignored)
|
||||
* @param int $microseconds The microseconds to set (ignored)
|
||||
* @return static A modified Date instance.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an Interval to a Date
|
||||
*
|
||||
* Any changes to the time will be ignored and reset to 00:00:00
|
||||
*
|
||||
* @param \DateInterval $interval The interval to modify this date by.
|
||||
* @return static A modified Date instance
|
||||
*/
|
||||
public function add($interval)
|
||||
{
|
||||
return parent::add($interval)->setTime(0, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Subtract an Interval from a Date.
|
||||
*
|
||||
* Any changes to the time will be ignored and reset to 00:00:00
|
||||
*
|
||||
* @param \DateInterval $interval The interval to modify this date by.
|
||||
* @return static A modified Date instance
|
||||
*/
|
||||
public function sub($interval)
|
||||
{
|
||||
return parent::sub($interval)->setTime(0, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* No-op method.
|
||||
*
|
||||
* Timezones have no effect on calendar dates.
|
||||
*
|
||||
* @param \DateTimeZone|string $value The DateTimeZone object or timezone name to use.
|
||||
* @return $this
|
||||
*/
|
||||
public function timezone($value)
|
||||
{
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* No-op method.
|
||||
*
|
||||
* Timezones have no effect on calendar dates.
|
||||
*
|
||||
* @param \DateTimeZone|string $value The DateTimeZone object or timezone name to use.
|
||||
* @return $this
|
||||
*/
|
||||
public function tz($value)
|
||||
{
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* No-op method.
|
||||
*
|
||||
* Timezones have no effect on calendar dates.
|
||||
*
|
||||
* @param \DateTimeZone|string $value The DateTimeZone object or timezone name to use.
|
||||
* @return $this
|
||||
*/
|
||||
public function setTimezone($value)
|
||||
{
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the timestamp value and get a new object back.
|
||||
*
|
||||
* This method will discard the time aspects of the timestamp
|
||||
* and only apply the date portions
|
||||
*
|
||||
* @param int $value The timestamp value to set.
|
||||
* @return static
|
||||
*/
|
||||
public function setTimestamp($value)
|
||||
{
|
||||
return parent::setTimestamp($value)->setTime(0, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Overloaded to ignore time changes.
|
||||
*
|
||||
* Changing any aspect of the time will be ignored, and the resulting object
|
||||
* will have its time frozen to 00:00:00.
|
||||
*
|
||||
* @param string $relative The relative change to make.
|
||||
* @return static A new date with the applied date changes.
|
||||
*/
|
||||
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;
|
||||
}
|
||||
}
|
||||
131
vendor/cakephp/chronos/src/Traits/MagicPropertyTrait.php
vendored
Normal file
131
vendor/cakephp/chronos/src/Traits/MagicPropertyTrait.php
vendored
Normal file
@@ -0,0 +1,131 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice. Provides various operator methods for datetime
|
||||
* objects.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
namespace Cake\Chronos\Traits;
|
||||
|
||||
use Cake\Chronos\ChronosInterface;
|
||||
use InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* Provides the magic methods that allow read access
|
||||
* to magic properties.
|
||||
*
|
||||
* @property-read int $year
|
||||
* @property-read int $yearIso
|
||||
* @property-read int $month
|
||||
* @property-read int $day
|
||||
* @property-read int $hour
|
||||
* @property-read int $minute
|
||||
* @property-read int $second
|
||||
* @property-read int $micro
|
||||
* @property-read int $dayOfWeek
|
||||
* @property-read int $dayOfYear
|
||||
* @property-read int $weekOfYear
|
||||
* @property-read int $daysInMonth
|
||||
* @property-read int $timestamp
|
||||
* @property-read int $weekOfMonth
|
||||
* @property-read int $age
|
||||
* @property-read int $quarter
|
||||
* @property-read int $offset
|
||||
* @property-read int $offsetHours
|
||||
* @property-read boolean $dst
|
||||
* @property-read boolean $local
|
||||
* @property-read boolean $utc
|
||||
* @property-read \DateTimeZone $timezone
|
||||
* @property-read \DateTimeZone $tz
|
||||
* @property-read string $timezoneName
|
||||
* @property-read string $tzName
|
||||
*/
|
||||
trait MagicPropertyTrait
|
||||
{
|
||||
/**
|
||||
* Get a part of the ChronosInterface object
|
||||
*
|
||||
* @param string $name The property name to read.
|
||||
* @return string|int|\DateTimeZone The property value.
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function __get($name)
|
||||
{
|
||||
static $formats = [
|
||||
'year' => 'Y',
|
||||
'yearIso' => 'o',
|
||||
'month' => 'n',
|
||||
'day' => 'j',
|
||||
'hour' => 'G',
|
||||
'minute' => 'i',
|
||||
'second' => 's',
|
||||
'micro' => 'u',
|
||||
'dayOfWeek' => 'N',
|
||||
'dayOfYear' => 'z',
|
||||
'weekOfYear' => 'W',
|
||||
'daysInMonth' => 't',
|
||||
'timestamp' => 'U',
|
||||
];
|
||||
|
||||
switch (true) {
|
||||
case isset($formats[$name]):
|
||||
return (int)$this->format($formats[$name]);
|
||||
|
||||
case $name === 'weekOfMonth':
|
||||
return (int)ceil($this->day / ChronosInterface::DAYS_PER_WEEK);
|
||||
|
||||
case $name === 'age':
|
||||
return $this->diffInYears();
|
||||
|
||||
case $name === 'quarter':
|
||||
return (int)ceil($this->month / 3);
|
||||
|
||||
case $name === 'offset':
|
||||
return $this->getOffset();
|
||||
|
||||
case $name === 'offsetHours':
|
||||
return $this->getOffset() / ChronosInterface::SECONDS_PER_MINUTE / ChronosInterface::MINUTES_PER_HOUR;
|
||||
|
||||
case $name === 'dst':
|
||||
return $this->format('I') === '1';
|
||||
|
||||
case $name === 'local':
|
||||
return $this->offset === $this->copy()->setTimezone(date_default_timezone_get())->offset;
|
||||
|
||||
case $name === 'utc':
|
||||
return $this->offset === 0;
|
||||
|
||||
case $name === 'timezone' || $name === 'tz':
|
||||
return $this->getTimezone();
|
||||
|
||||
case $name === 'timezoneName' || $name === 'tzName':
|
||||
return $this->getTimezone()->getName();
|
||||
|
||||
default:
|
||||
throw new InvalidArgumentException(sprintf("Unknown getter '%s'", $name));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an attribute exists on the object
|
||||
*
|
||||
* @param string $name The property name to check.
|
||||
* @return bool Whether or not the property exists.
|
||||
*/
|
||||
public function __isset($name)
|
||||
{
|
||||
try {
|
||||
$this->__get($name);
|
||||
} catch (InvalidArgumentException $e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
1082
vendor/cakephp/chronos/src/Traits/ModifierTrait.php
vendored
Normal file
1082
vendor/cakephp/chronos/src/Traits/ModifierTrait.php
vendored
Normal file
File diff suppressed because it is too large
Load Diff
58
vendor/cakephp/chronos/src/Traits/RelativeKeywordTrait.php
vendored
Normal file
58
vendor/cakephp/chronos/src/Traits/RelativeKeywordTrait.php
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice. Provides various operator methods for datetime
|
||||
* objects.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
namespace Cake\Chronos\Traits;
|
||||
|
||||
/**
|
||||
* Provides methods for testing if strings contain relative keywords.
|
||||
*/
|
||||
trait RelativeKeywordTrait
|
||||
{
|
||||
protected static $relativePattern = '/this|next|last|tomorrow|yesterday|midnight|today|[+-]|first|last|ago/i';
|
||||
|
||||
/**
|
||||
* Determine if there is just a time in the time string
|
||||
*
|
||||
* @param string $time The time string to check.
|
||||
* @return bool true if there is a keyword, otherwise false
|
||||
*/
|
||||
private static function isTimeExpression($time)
|
||||
{
|
||||
// Just a time
|
||||
if (preg_match('/^[0-2]?[0-9]:[0-5][0-9](?::[0-5][0-9])?$/', $time)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if there is a relative keyword in the time string, this is to
|
||||
* create dates relative to now for test instances. e.g.: next tuesday
|
||||
*
|
||||
* @param string $time The time string to check.
|
||||
* @return bool true if there is a keyword, otherwise false
|
||||
*/
|
||||
public static function hasRelativeKeywords($time)
|
||||
{
|
||||
if (self::isTimeExpression($time)) {
|
||||
return true;
|
||||
}
|
||||
// skip common format with a '-' in it
|
||||
if (preg_match('/[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}/', $time) !== 1) {
|
||||
return preg_match(static::$relativePattern, $time) > 0;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
59
vendor/cakephp/chronos/src/Traits/TestingAidTrait.php
vendored
Normal file
59
vendor/cakephp/chronos/src/Traits/TestingAidTrait.php
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice. Provides various operator methods for datetime
|
||||
* objects.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
namespace Cake\Chronos\Traits;
|
||||
|
||||
use Cake\Chronos\Chronos;
|
||||
use Cake\Chronos\ChronosInterface;
|
||||
|
||||
/**
|
||||
* Provides methods for setting a 'test' now. This lets you
|
||||
* retrieve pre-determined times with now().
|
||||
*/
|
||||
trait TestingAidTrait
|
||||
{
|
||||
|
||||
/**
|
||||
* Set the test now used by Date and Time classes provided by Chronos
|
||||
*
|
||||
* @see \Cake\Chronos\Chronos::setTestNow()
|
||||
* @param \Cake\Chronos\ChronosInterface|string|null $testNow The instance to use for all future instances.
|
||||
* @return void
|
||||
*/
|
||||
public static function setTestNow($testNow = null)
|
||||
{
|
||||
Chronos::setTestNow($testNow);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the test instance stored in Chronos
|
||||
*
|
||||
* @see \Cake\Chronos\Chronos::getTestNow()
|
||||
* @return static|null the current instance used for testing or null.
|
||||
*/
|
||||
public static function getTestNow()
|
||||
{
|
||||
return Chronos::getTestNow();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get whether or not Chronos has a test instance set.
|
||||
*
|
||||
* @see \Cake\Chronos\Chronos::hasTestNow()
|
||||
* @return bool True if there is a test instance, otherwise false
|
||||
*/
|
||||
public static function hasTestNow()
|
||||
{
|
||||
return Chronos::hasTestNow();
|
||||
}
|
||||
}
|
||||
60
vendor/cakephp/chronos/src/Traits/TimezoneTrait.php
vendored
Normal file
60
vendor/cakephp/chronos/src/Traits/TimezoneTrait.php
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice. Provides various operator methods for datetime
|
||||
* objects.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
namespace Cake\Chronos\Traits;
|
||||
|
||||
/**
|
||||
* Methods for modifying/reading timezone data.
|
||||
*/
|
||||
trait TimezoneTrait
|
||||
{
|
||||
/**
|
||||
* Alias for setTimezone()
|
||||
*
|
||||
* @param \DateTimeZone|string $value The DateTimeZone object or timezone name to use.
|
||||
* @return static
|
||||
*/
|
||||
public function timezone($value)
|
||||
{
|
||||
return $this->setTimezone($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for setTimezone()
|
||||
*
|
||||
* @param \DateTimeZone|string $value The DateTimeZone object or timezone name to use.
|
||||
* @return static
|
||||
*/
|
||||
public function tz($value)
|
||||
{
|
||||
return $this->setTimezone($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the instance's timezone from a string or object
|
||||
*
|
||||
* @param \DateTimeZone|string $value The DateTimeZone object or timezone name to use.
|
||||
* @return static
|
||||
*/
|
||||
public function setTimezone($value)
|
||||
{
|
||||
$date = parent::setTimezone(static::safeCreateDateTimeZone($value));
|
||||
|
||||
// https://bugs.php.net/bug.php?id=72338
|
||||
// this is workaround for this bug
|
||||
// Needed for PHP below 7.0 version
|
||||
$date->getTimestamp();
|
||||
|
||||
return $date;
|
||||
}
|
||||
}
|
||||
93
vendor/cakephp/chronos/src/Translator.php
vendored
Normal file
93
vendor/cakephp/chronos/src/Translator.php
vendored
Normal file
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
namespace Cake\Chronos;
|
||||
|
||||
/**
|
||||
* Basic english only 'translator' for diffForHumans()
|
||||
*/
|
||||
class Translator
|
||||
{
|
||||
/**
|
||||
* Translation strings.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $strings = [
|
||||
'year' => '1 year',
|
||||
'year_plural' => '{count} years',
|
||||
'month' => '1 month',
|
||||
'month_plural' => '{count} months',
|
||||
'week' => '1 week',
|
||||
'week_plural' => '{count} weeks',
|
||||
'day' => '1 day',
|
||||
'day_plural' => '{count} days',
|
||||
'hour' => '1 hour',
|
||||
'hour_plural' => '{count} hours',
|
||||
'minute' => '1 minute',
|
||||
'minute_plural' => '{count} minutes',
|
||||
'second' => '1 second',
|
||||
'second_plural' => '{count} seconds',
|
||||
'ago' => '{time} ago',
|
||||
'from_now' => '{time} from now',
|
||||
'after' => '{time} after',
|
||||
'before' => '{time} before',
|
||||
];
|
||||
|
||||
/**
|
||||
* Check if a translation key exists.
|
||||
*
|
||||
* @param string $key The key to check.
|
||||
* @return bool Whether or not the key exists.
|
||||
*/
|
||||
public function exists($key)
|
||||
{
|
||||
return isset(static::$strings[$key]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a plural message.
|
||||
*
|
||||
* @param string $key The key to use.
|
||||
* @param int $count The number of items in the translation.
|
||||
* @param array $vars Additional context variables.
|
||||
* @return string The translated message or ''.
|
||||
*/
|
||||
public function plural($key, $count, array $vars = [])
|
||||
{
|
||||
if ($count === 1) {
|
||||
return $this->singular($key, $vars);
|
||||
}
|
||||
|
||||
return $this->singular($key . '_plural', ['count' => $count] + $vars);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a singular message.
|
||||
*
|
||||
* @param string $key The key to use.
|
||||
* @param array $vars Additional context variables.
|
||||
* @return string The translated message or ''.
|
||||
*/
|
||||
public function singular($key, array $vars = [])
|
||||
{
|
||||
if (isset(static::$strings[$key])) {
|
||||
$varKeys = array_keys($vars);
|
||||
foreach ($varKeys as $i => $k) {
|
||||
$varKeys[$i] = '{' . $k . '}';
|
||||
}
|
||||
|
||||
return str_replace($varKeys, $vars, static::$strings[$key]);
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
}
|
||||
20
vendor/cakephp/chronos/src/carbon_compat.php
vendored
Normal file
20
vendor/cakephp/chronos/src/carbon_compat.php
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
* @copyright Copyright (c) Brian Nesbitt <brian@nesbot.com>
|
||||
* @link http://cakephp.org CakePHP(tm) Project
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
define('CHRONOS_SUPPORTS_MICROSECONDS', version_compare(PHP_VERSION, '7.1.0', '>='));
|
||||
|
||||
if (!class_exists('Carbon\Carbon')) {
|
||||
// Create class aliases for Carbon so applications
|
||||
// can upgrade more easily.
|
||||
class_alias('Cake\Chronos\Chronos', 'Carbon\MutableDateTime');
|
||||
class_alias('Cake\Chronos\ChronosInterface', 'Carbon\CarbonInterface');
|
||||
}
|
||||
Reference in New Issue
Block a user