* @link http://cakephp.org CakePHP(tm) Project * @license http://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos; use DateTimeInterface; use DateTimeZone; /** * An extension to the DateTimeInterface for a friendlier API * * @method static modify(string $relative) */ interface ChronosInterface extends DateTimeInterface { /** * The day constants */ const MONDAY = 1; const TUESDAY = 2; const WEDNESDAY = 3; const THURSDAY = 4; const FRIDAY = 5; const SATURDAY = 6; const SUNDAY = 7; /** * Number of X in Y */ const YEARS_PER_CENTURY = 100; const YEARS_PER_DECADE = 10; const MONTHS_PER_YEAR = 12; const MONTHS_PER_QUARTER = 3; const WEEKS_PER_YEAR = 52; const DAYS_PER_WEEK = 7; const HOURS_PER_DAY = 24; const MINUTES_PER_HOUR = 60; const SECONDS_PER_MINUTE = 60; /** * Default format to use for __toString method when type juggling occurs. * * @var string */ const DEFAULT_TO_STRING_FORMAT = 'Y-m-d H:i:s'; /** * 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); /** * Get a copy of the instance * * @return static */ public function copy(); /** * Set the instance's year * * @param int $value The year value. * @return static */ public function year($value); /** * Set the instance's month * * @param int $value The month value. * @return static */ public function month($value); /** * Set the instance's day * * @param int $value The day value. * @return static */ public function day($value); /** * Set the instance's hour * * @param int $value The hour value. * @return static */ public function hour($value); /** * Set the instance's minute * * @param int $value The minute value. * @return static */ public function minute($value); /** * Set the instance's second * * @param int $value The seconds value. * @return static */ public function second($value); /** * Set the date and time all together * * @param int $year The year to set. * @param int $month The month to set. * @param int $day The day to set. * @param int $hour The hour to set. * @param int $minute The minute to set. * @param int $second The second to set. * @return static */ public function setDateTime($year, $month, $day, $hour, $minute, $second = 0); /** * Set the time by time string * * @param string $time Time as string. * @return static */ public function setTimeFromTimeString($time); /** * Set the instance's timestamp * * @param int $value The timestamp value to set. * @return static */ public function timestamp($value); /** * Alias for setTimezone() * * @param \DateTimeZone|string $value The DateTimeZone object or timezone name to use. * @return static */ public function timezone($value); /** * Alias for setTimezone() * * @param \DateTimeZone|string $value The DateTimeZone object or timezone name to use. * @return static */ public function tz($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); /** * Format the instance as date * * @return string */ public function toDateString(); /** * Format the instance as a readable date * * @return string */ public function toFormattedDateString(); /** * Format the instance as time * * @return string */ public function toTimeString(); /** * Format the instance as date and time * * @return string */ public function toDateTimeString(); /** * Format the instance with day, date and time * * @return string */ public function toDayDateTimeString(); /** * Format the instance as ATOM * * @return string */ public function toAtomString(); /** * Format the instance as COOKIE * * @return string */ public function toCookieString(); /** * Format the instance as ISO8601 * * @return string */ public function toIso8601String(); /** * Format the instance as RFC822 * * @return string */ public function toRfc822String(); /** * Format the instance as RFC850 * * @return string */ public function toRfc850String(); /** * Format the instance as RFC1036 * * @return string */ public function toRfc1036String(); /** * Format the instance as RFC1123 * * @return string */ public function toRfc1123String(); /** * Format the instance as RFC2822 * * @return string */ public function toRfc2822String(); /** * Format the instance as RFC3339 * * @return string */ public function toRfc3339String(); /** * Format the instance as RSS * * @return string */ public function toRssString(); /** * Format the instance as W3C * * @return string */ public function toW3cString(); /** * 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); /** * 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); /** * 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); /** * 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); /** * 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); /** * 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); /** * 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); /** * 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 static */ public function closest(ChronosInterface $dt1, ChronosInterface $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 static */ public function farthest(ChronosInterface $dt1, ChronosInterface $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); /** * 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); /** * Determines if the instance is a weekday * * @return bool */ public function isWeekday(); /** * Determines if the instance is a weekend day * * @return bool */ public function isWeekend(); /** * Determines if the instance is yesterday * * @return bool */ public function isYesterday(); /** * Determines if the instance is today * * @return bool */ public function isToday(); /** * Determines if the instance is tomorrow * * @return bool */ public function isTomorrow(); /** * Determines if the instance is in the future, ie. greater (after) than now * * @return bool */ public function isFuture(); /** * Determines if the instance is in the past, ie. less (before) than now * * @return bool */ public function isPast(); /** * Determines if the instance is a leap year * * @return bool */ public function isLeapYear(); /** * 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); /** * Checks if this day is a Sunday. * * @return bool */ public function isSunday(); /** * Checks if this day is a Monday. * * @return bool */ public function isMonday(); /** * Checks if this day is a Tuesday. * * @return bool */ public function isTuesday(); /** * Checks if this day is a Wednesday. * * @return bool */ public function isWednesday(); /** * Checks if this day is a Thursday. * * @return bool */ public function isThursday(); /** * Checks if this day is a Friday. * * @return bool */ public function isFriday(); /** * Checks if this day is a Saturday. * * @return bool */ public function isSaturday(); /** * Returns true if this object represents a date within the current week * * @return bool */ public function isThisWeek(); /** * Returns true if this object represents a date within the current month * * @return bool */ public function isThisMonth(); /** * Returns true if this object represents a date within the current year * * @return bool */ public function isThisYear(); /** * Add years to the instance. Positive $value travel forward while * negative $value travel into the past. * * @param int $value The number of years to add. * @return static */ public function addYears($value); /** * Add a year to the instance * * @param int $value The number of years to add. * @return static */ public function addYear($value = 1); /** * Remove a year from the instance * * @param int $value The number of years to remove. * @return static */ public function subYear($value = 1); /** * Remove years from the instance. * * @param int $value The number of years to remove. * @return static */ public function subYears($value); /** * Add months to the instance. Positive $value travels forward while * negative $value travels into the past. * * When adding or subtracting months, if the resulting time is a date * that does not exist, the result of this operation will always be the * last day of the intended month. * * ### Example: * * ``` * (new Chronos('2015-01-03'))->addMonths(1); // Results in 2015-02-03 * * (new Chronos('2015-01-31'))->addMonths(1); // Results in 2015-02-28 * ``` * * @param int $value The number of months to add. * @return static */ public function addMonths($value); /** * Add a month to the instance * * When adding or subtracting months, if the resulting time is a date * that does not exist, the result of this operation will always be the * last day of the intended month. * * ### Example: * * ``` * (new Chronos('2015-01-03'))->addMonth(); // Results in 2015-02-03 * * (new Chronos('2015-01-31'))->addMonth(); // Results in 2015-02-28 * ``` * * @param int $value The number of months to add. * @return static */ public function addMonth($value = 1); /** * Remove a month from the instance * * When adding or subtracting months, if the resulting time is a date * that does not exist, the result of this operation will always be the * last day of the intended month. * * ### Example: * * ``` * (new Chronos('2015-03-01'))->subMonth(); // Results in 2015-02-01 * * (new Chronos('2015-03-31'))->subMonth(); // Results in 2015-02-28 * ``` * * @param int $value The number of months to remove. * @return static */ public function subMonth($value = 1); /** * Remove months from the instance * * When adding or subtracting months, if the resulting time is a date * that does not exist, the result of this operation will always be the * last day of the intended month. * * ### Example: * * ``` * (new Chronos('2015-03-01'))->subMonths(1); // Results in 2015-02-01 * * (new Chronos('2015-03-31'))->subMonths(1); // Results in 2015-02-28 * ``` * * @param int $value The number of months to remove. * @return static */ public function subMonths($value); /** * Add months with overflowing to the instance. Positive $value * travels forward while negative $value travels into the past. * * @param int $value The number of months to add. * @return static */ public function addMonthsWithOverflow($value); /** * Add a month with overflow to the instance * * @param int $value The number of months to add. * @return static */ public function addMonthWithOverflow($value = 1); /** * Remove a month with overflow from the instance * * @param int $value The number of months to remove. * @return static */ public function subMonthWithOverflow($value = 1); /** * Remove months with overflow from the instance * * @param int $value The number of months to remove. * @return static */ public function subMonthsWithOverflow($value); /** * Add days to the instance. Positive $value travels forward while * negative $value travels into the past. * * @param int $value The number of days to add. * @return static */ public function addDays($value); /** * Add a day to the instance * * @param int $value The number of days to add. * @return static */ public function addDay($value = 1); /** * Remove a day from the instance * * @param int $value The number of days to remove. * @return static */ public function subDay($value = 1); /** * Remove days from the instance * * @param int $value The number of days to remove. * @return static */ public function subDays($value); /** * Add weekdays to the instance. Positive $value travels forward while * negative $value travels into the past. * * @param int $value The number of weekdays to add. * @return static */ public function addWeekdays($value); /** * Add a weekday to the instance * * @param int $value The number of weekdays to add. * @return static */ public function addWeekday($value = 1); /** * Remove a weekday from the instance * * @param int $value The number of weekdays to remove. * @return static */ public function subWeekday($value = 1); /** * Remove weekdays from the instance * * @param int $value The number of weekdays to remove. * @return static */ public function subWeekdays($value); /** * Add weeks to the instance. Positive $value travels forward while * negative $value travels into the past. * * @param int $value The number of weeks to add. * @return static */ public function addWeeks($value); /** * Add a week to the instance * * @param int $value The number of weeks to add. * @return static */ public function addWeek($value = 1); /** * Remove a week from the instance * * @param int $value The number of weeks to remove. * @return static */ public function subWeek($value = 1); /** * Remove weeks to the instance * * @param int $value The number of weeks to remove. * @return static */ public function subWeeks($value); /** * Add hours to the instance. Positive $value travels forward while * negative $value travels into the past. * * @param int $value The number of hours to add. * @return static */ public function addHours($value); /** * Add an hour to the instance * * @param int $value The number of hours to add. * @return static */ public function addHour($value = 1); /** * Remove an hour from the instance * * @param int $value The number of hours to remove. * @return static */ public function subHour($value = 1); /** * Remove hours from the instance * * @param int $value The number of hours to remove. * @return static */ public function subHours($value); /** * Add minutes to the instance. Positive $value travels forward while * negative $value travels into the past. * * @param int $value The number of minutes to add. * @return static */ public function addMinutes($value); /** * Add a minute to the instance * * @param int $value The number of minutes to add. * @return static */ public function addMinute($value = 1); /** * Remove a minute from the instance * * @param int $value The number of minutes to remove. * @return static */ public function subMinute($value = 1); /** * Remove minutes from the instance * * @param int $value The number of minutes to remove. * @return static */ public function subMinutes($value); /** * Add seconds to the instance. Positive $value travels forward while * negative $value travels into the past. * * @param int $value The number of seconds to add. * @return static */ public function addSeconds($value); /** * Add a second to the instance * * @param int $value The number of seconds to add. * @return static */ public function addSecond($value = 1); /** * Remove a second from the instance * * @param int $value The number of seconds to remove. * @return static */ public function subSecond($value = 1); /** * Remove seconds from the instance * * @param int $value The number of seconds to remove. * @return static */ public function subSeconds($value); /** * Get the difference in a human readable format in the current locale. * * 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); /** * 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); /** * 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); /** * 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); /** * 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); /** * 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); /** * 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); /** * 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); /** * 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); /** * 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); /** * 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); /** * 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); /** * 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); /** * The number of seconds since midnight. * * @return int */ public function secondsSinceMidnight(); /** * The number of seconds until 23:59:59. * * @return int */ public function secondsUntilEndOfDay(); /** * Resets the time to 00:00:00 * * @return static */ public function startOfDay(); /** * Resets the time to 23:59:59 * * @return static */ public function endOfDay(); /** * Resets the date to the first day of the month and the time to 00:00:00 * * @return static */ public function startOfMonth(); /** * Resets the date to end of the month and time to 23:59:59 * * @return static */ public function endOfMonth(); /** * Resets the date to the first day of the year and the time to 00:00:00 * * @return static */ public function startOfYear(); /** * Resets the date to end of the year and time to 23:59:59 * * @return static */ public function endOfYear(); /** * Resets the date to the first day of the decade and the time to 00:00:00 * * @return static */ public function startOfDecade(); /** * Resets the date to end of the decade and time to 23:59:59 * * @return static */ public function endOfDecade(); /** * Resets the date to the first day of the century and the time to 00:00:00 * * @return static */ public function startOfCentury(); /** * Resets the date to end of the century and time to 23:59:59 * * @return static */ public function endOfCentury(); /** * Resets the date to the first day of week (defined in $weekStartsAt) and the time to 00:00:00 * * @return static */ public function startOfWeek(); /** * Resets the date to end of week (defined in $weekEndsAt) and time to 23:59:59 * * @return static */ public function endOfWeek(); /** * Modify to the next occurrence of a given day of the week. * If no dayOfWeek is provided, modify to the next occurrence * of the current day of the week. Use the supplied consts * to indicate the desired dayOfWeek, ex. static::MONDAY. * * @param int $dayOfWeek The day of the week to move to. * @return mixed */ public function next($dayOfWeek = null); /** * Modify to the previous occurrence of a given day of the week. * If no dayOfWeek is provided, modify to the previous occurrence * of the current day of the week. Use the supplied consts * to indicate the desired dayOfWeek, ex. static::MONDAY. * * @param int $dayOfWeek The day of the week to move to. * @return mixed */ public function previous($dayOfWeek = null); /** * Modify to the first occurrence of a given day of the week * in the current month. If no dayOfWeek is provided, modify to the * first day of the current month. Use the supplied consts * to indicate the desired dayOfWeek, ex. static::MONDAY. * * @param int $dayOfWeek The day of the week to move to. * @return mixed */ public function firstOfMonth($dayOfWeek = null); /** * Modify to the last occurrence of a given day of the week * in the current month. If no dayOfWeek is provided, modify to the * last day of the current month. Use the supplied consts * to indicate the desired dayOfWeek, ex. static::MONDAY. * * @param int $dayOfWeek The day of the week to move to. * @return mixed */ public function lastOfMonth($dayOfWeek = null); /** * Modify to the given occurrence of a given day of the week * in the current month. If the calculated occurrence is outside the scope * of the current month, then return false and no modifications are made. * Use the supplied consts to indicate the desired dayOfWeek, ex. static::MONDAY. * * @param int $nth The offset to use. * @param int $dayOfWeek The day of the week to move to. * @return mixed */ public function nthOfMonth($nth, $dayOfWeek); /** * Modify to the first occurrence of a given day of the week * in the current quarter. If no dayOfWeek is provided, modify to the * first day of the current quarter. Use the supplied consts * to indicate the desired dayOfWeek, ex. static::MONDAY. * * @param int $dayOfWeek The day of the week to move to. * @return mixed */ public function firstOfQuarter($dayOfWeek = null); /** * Modify to the last occurrence of a given day of the week * in the current quarter. If no dayOfWeek is provided, modify to the * last day of the current quarter. Use the supplied consts * to indicate the desired dayOfWeek, ex. static::MONDAY. * * @param int $dayOfWeek The day of the week to move to. * @return mixed */ public function lastOfQuarter($dayOfWeek = null); /** * Modify to the given occurrence of a given day of the week * in the current quarter. If the calculated occurrence is outside the scope * of the current quarter, then return false and no modifications are made. * Use the supplied consts to indicate the desired dayOfWeek, ex. static::MONDAY. * * @param int $nth The offset to use. * @param int $dayOfWeek The day of the week to move to. * @return mixed */ public function nthOfQuarter($nth, $dayOfWeek); /** * Modify to the first occurrence of a given day of the week * in the current year. If no dayOfWeek is provided, modify to the * first day of the current year. Use the supplied consts * to indicate the desired dayOfWeek, ex. static::MONDAY. * * @param int $dayOfWeek The day of the week to move to. * @return mixed */ public function firstOfYear($dayOfWeek = null); /** * Modify to the last occurrence of a given day of the week * in the current year. If no dayOfWeek is provided, modify to the * last day of the current year. Use the supplied consts * to indicate the desired dayOfWeek, ex. static::MONDAY. * * @param int $dayOfWeek The day of the week to move to. * @return mixed */ public function lastOfYear($dayOfWeek = null); /** * Modify to the given occurrence of a given day of the week * in the current year. If the calculated occurrence is outside the scope * of the current year, then return false and no modifications are made. * Use the supplied consts to indicate the desired dayOfWeek, ex. static::MONDAY. * * @param int $nth The offset to use. * @param int $dayOfWeek The day of the week to move to. * @return mixed */ public function nthOfYear($nth, $dayOfWeek); /** * Modify the current instance to the average of a given instance (default now) and the current instance. * * @param \Cake\Chronos\ChronosInterface $dt The instance to compare with. * @return static */ public function average(ChronosInterface $dt = null); /** * Check if its the birthday. Compares the date/month values of the two dates. * * @param \Cake\Chronos\ChronosInterface $dt The instance to compare with. * @return bool */ public function isBirthday(ChronosInterface $dt); /** * 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); /** * 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); /** * Check if instance of ChronosInterface is mutable. * * @return bool */ public function isMutable(); }