2022-12-24 22:10:40 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Illuminate\Support;
|
|
|
|
|
|
|
|
use Carbon\Factory;
|
|
|
|
use InvalidArgumentException;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @see https://carbon.nesbot.com/docs/
|
|
|
|
* @see https://github.com/briannesbitt/Carbon/blob/master/src/Carbon/Factory.php
|
|
|
|
*
|
|
|
|
* @method \Illuminate\Support\Carbon create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $tz = null)
|
|
|
|
* @method \Illuminate\Support\Carbon createFromDate($year = null, $month = null, $day = null, $tz = null)
|
|
|
|
* @method \Illuminate\Support\Carbon|false createFromFormat($format, $time, $tz = null)
|
|
|
|
* @method \Illuminate\Support\Carbon createFromTime($hour = 0, $minute = 0, $second = 0, $tz = null)
|
|
|
|
* @method \Illuminate\Support\Carbon createFromTimeString($time, $tz = null)
|
|
|
|
* @method \Illuminate\Support\Carbon createFromTimestamp($timestamp, $tz = null)
|
|
|
|
* @method \Illuminate\Support\Carbon createFromTimestampMs($timestamp, $tz = null)
|
|
|
|
* @method \Illuminate\Support\Carbon createFromTimestampUTC($timestamp)
|
|
|
|
* @method \Illuminate\Support\Carbon createMidnightDate($year = null, $month = null, $day = null, $tz = null)
|
|
|
|
* @method \Illuminate\Support\Carbon|false createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null)
|
2024-01-31 22:15:08 +08:00
|
|
|
* @method void disableHumanDiffOption($humanDiffOption)
|
|
|
|
* @method void enableHumanDiffOption($humanDiffOption)
|
2022-12-24 22:10:40 +08:00
|
|
|
* @method mixed executeWithLocale($locale, $func)
|
|
|
|
* @method \Illuminate\Support\Carbon fromSerialized($value)
|
|
|
|
* @method array getAvailableLocales()
|
|
|
|
* @method array getDays()
|
|
|
|
* @method int getHumanDiffOptions()
|
|
|
|
* @method array getIsoUnits()
|
2024-01-31 22:15:08 +08:00
|
|
|
* @method array getLastErrors()
|
2022-12-24 22:10:40 +08:00
|
|
|
* @method string getLocale()
|
|
|
|
* @method int getMidDayAt()
|
2024-01-31 22:15:08 +08:00
|
|
|
* @method \Illuminate\Support\Carbon|null getTestNow()
|
2022-12-24 22:10:40 +08:00
|
|
|
* @method \Symfony\Component\Translation\TranslatorInterface getTranslator()
|
|
|
|
* @method int getWeekEndsAt()
|
|
|
|
* @method int getWeekStartsAt()
|
|
|
|
* @method array getWeekendDays()
|
|
|
|
* @method bool hasFormat($date, $format)
|
|
|
|
* @method bool hasMacro($name)
|
|
|
|
* @method bool hasRelativeKeywords($time)
|
|
|
|
* @method bool hasTestNow()
|
|
|
|
* @method \Illuminate\Support\Carbon instance($date)
|
|
|
|
* @method bool isImmutable()
|
|
|
|
* @method bool isModifiableUnit($unit)
|
2024-01-31 22:15:08 +08:00
|
|
|
* @method bool isMutable()
|
2022-12-24 22:10:40 +08:00
|
|
|
* @method bool isStrictModeEnabled()
|
|
|
|
* @method bool localeHasDiffOneDayWords($locale)
|
|
|
|
* @method bool localeHasDiffSyntax($locale)
|
|
|
|
* @method bool localeHasDiffTwoDayWords($locale)
|
|
|
|
* @method bool localeHasPeriodSyntax($locale)
|
|
|
|
* @method bool localeHasShortUnits($locale)
|
|
|
|
* @method void macro($name, $macro)
|
|
|
|
* @method \Illuminate\Support\Carbon|null make($var)
|
|
|
|
* @method \Illuminate\Support\Carbon maxValue()
|
|
|
|
* @method \Illuminate\Support\Carbon minValue()
|
|
|
|
* @method void mixin($mixin)
|
|
|
|
* @method \Illuminate\Support\Carbon now($tz = null)
|
|
|
|
* @method \Illuminate\Support\Carbon parse($time = null, $tz = null)
|
|
|
|
* @method string pluralUnit(string $unit)
|
|
|
|
* @method void resetMonthsOverflow()
|
|
|
|
* @method void resetToStringFormat()
|
|
|
|
* @method void resetYearsOverflow()
|
|
|
|
* @method void serializeUsing($callback)
|
2024-01-31 22:15:08 +08:00
|
|
|
* @method void setHumanDiffOptions($humanDiffOptions)
|
2022-12-24 22:10:40 +08:00
|
|
|
* @method bool setLocale($locale)
|
|
|
|
* @method void setMidDayAt($hour)
|
|
|
|
* @method void setTestNow($testNow = null)
|
|
|
|
* @method void setToStringFormat($format)
|
|
|
|
* @method void setTranslator(\Symfony\Component\Translation\TranslatorInterface $translator)
|
2024-01-31 22:15:08 +08:00
|
|
|
* @method void setUtf8($utf8)
|
2022-12-24 22:10:40 +08:00
|
|
|
* @method void setWeekEndsAt($day)
|
|
|
|
* @method void setWeekStartsAt($day)
|
|
|
|
* @method void setWeekendDays($days)
|
|
|
|
* @method bool shouldOverflowMonths()
|
|
|
|
* @method bool shouldOverflowYears()
|
|
|
|
* @method string singularUnit(string $unit)
|
|
|
|
* @method \Illuminate\Support\Carbon today($tz = null)
|
|
|
|
* @method \Illuminate\Support\Carbon tomorrow($tz = null)
|
|
|
|
* @method void useMonthsOverflow($monthsOverflow = true)
|
2024-01-31 22:15:08 +08:00
|
|
|
* @method void useStrictMode($strictModeEnabled = true)
|
2022-12-24 22:10:40 +08:00
|
|
|
* @method void useYearsOverflow($yearsOverflow = true)
|
|
|
|
* @method \Illuminate\Support\Carbon yesterday($tz = null)
|
|
|
|
*/
|
|
|
|
class DateFactory
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* The default class that will be used for all created dates.
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
const DEFAULT_CLASS_NAME = Carbon::class;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The type (class) of dates that should be created.
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected static $dateClass;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This callable may be used to intercept date creation.
|
|
|
|
*
|
|
|
|
* @var callable
|
|
|
|
*/
|
|
|
|
protected static $callable;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The Carbon factory that should be used when creating dates.
|
|
|
|
*
|
|
|
|
* @var object
|
|
|
|
*/
|
|
|
|
protected static $factory;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Use the given handler when generating dates (class name, callable, or factory).
|
|
|
|
*
|
|
|
|
* @param mixed $handler
|
|
|
|
* @return mixed
|
|
|
|
*
|
|
|
|
* @throws \InvalidArgumentException
|
|
|
|
*/
|
|
|
|
public static function use($handler)
|
|
|
|
{
|
|
|
|
if (is_callable($handler) && is_object($handler)) {
|
|
|
|
return static::useCallable($handler);
|
|
|
|
} elseif (is_string($handler)) {
|
|
|
|
return static::useClass($handler);
|
|
|
|
} elseif ($handler instanceof Factory) {
|
|
|
|
return static::useFactory($handler);
|
|
|
|
}
|
|
|
|
|
|
|
|
throw new InvalidArgumentException('Invalid date creation handler. Please provide a class name, callable, or Carbon factory.');
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Use the default date class when generating dates.
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public static function useDefault()
|
|
|
|
{
|
|
|
|
static::$dateClass = null;
|
|
|
|
static::$callable = null;
|
|
|
|
static::$factory = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Execute the given callable on each date creation.
|
|
|
|
*
|
|
|
|
* @param callable $callable
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public static function useCallable(callable $callable)
|
|
|
|
{
|
|
|
|
static::$callable = $callable;
|
|
|
|
|
|
|
|
static::$dateClass = null;
|
|
|
|
static::$factory = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Use the given date type (class) when generating dates.
|
|
|
|
*
|
|
|
|
* @param string $dateClass
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public static function useClass($dateClass)
|
|
|
|
{
|
|
|
|
static::$dateClass = $dateClass;
|
|
|
|
|
|
|
|
static::$factory = null;
|
|
|
|
static::$callable = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Use the given Carbon factory when generating dates.
|
|
|
|
*
|
|
|
|
* @param object $factory
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public static function useFactory($factory)
|
|
|
|
{
|
|
|
|
static::$factory = $factory;
|
|
|
|
|
|
|
|
static::$dateClass = null;
|
|
|
|
static::$callable = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handle dynamic calls to generate dates.
|
|
|
|
*
|
|
|
|
* @param string $method
|
|
|
|
* @param array $parameters
|
|
|
|
* @return mixed
|
|
|
|
*
|
|
|
|
* @throws \RuntimeException
|
|
|
|
*/
|
|
|
|
public function __call($method, $parameters)
|
|
|
|
{
|
|
|
|
$defaultClassName = static::DEFAULT_CLASS_NAME;
|
|
|
|
|
|
|
|
// Using callable to generate dates...
|
|
|
|
if (static::$callable) {
|
|
|
|
return call_user_func(static::$callable, $defaultClassName::$method(...$parameters));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Using Carbon factory to generate dates...
|
|
|
|
if (static::$factory) {
|
|
|
|
return static::$factory->$method(...$parameters);
|
|
|
|
}
|
|
|
|
|
|
|
|
$dateClass = static::$dateClass ?: $defaultClassName;
|
|
|
|
|
|
|
|
// Check if the date can be created using the public class method...
|
|
|
|
if (method_exists($dateClass, $method) ||
|
|
|
|
method_exists($dateClass, 'hasMacro') && $dateClass::hasMacro($method)) {
|
|
|
|
return $dateClass::$method(...$parameters);
|
|
|
|
}
|
|
|
|
|
|
|
|
// If that fails, create the date with the default class...
|
|
|
|
$date = $defaultClassName::$method(...$parameters);
|
|
|
|
|
|
|
|
// If the configured class has an "instance" method, we'll try to pass our date into there...
|
|
|
|
if (method_exists($dateClass, 'instance')) {
|
|
|
|
return $dateClass::instance($date);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Otherwise, assume the configured class has a DateTime compatible constructor...
|
|
|
|
return new $dateClass($date->format('Y-m-d H:i:s.u'), $date->getTimezone());
|
|
|
|
}
|
|
|
|
}
|