МЕНЮ

Необходимо войти,чтобы получить возможность оценивать записи.

Войти

Class Carbon

www.radiobells.com #radiobells_script_hash

0 0

Class Carbon


Carbon класс унаследован от PHP DateTime класса.

namespace Carbon;

class Carbon extends \DateTime
{
    // code here
}

Carbon обладает всей функциональностью, унаследованной от базового DateTime класса, поэтому, если что-то пропущено в классе Carbone, то вы можете использовать функциональность DateTime класса.

Вы можете увидеть  из кода ниже, что класс Carbon объявлен в пространстве имен Carbon.  Перед использованием вам нужно объявить пространство имен Carbon, чтобы избавить себя от необходимости каждый раз прописывать полное квалификационное имя.

use Carbon\Carbon;

Обработка часовых поясов  основана на базовой реализации DateTime. Например, все сравнения выполняются в формате UTC или в часовом поясе используемого времени.

$dtToronto = Carbon::createFromDate(2012, 1, 1, 'America/Toronto');
$dtVancouver = Carbon::createFromDate(2012, 1, 1, 'America/Vancouver');

echo $dtVancouver->diffInHours($dtToronto); // 3 – разница в часах

Также сравнения проводятся в часовом поясе, предоставленного экземпляра Carbone. Для примера, моя текущая временная зона имеет разницу в -13 часов от Токио. Carbon::now(‘Asia/Tokio’)->isToday() возвращала бы false для любого времени, выходящего за пределы 13 часов моего времени. Это не имеет смысла, так как с now() в Токио всегда сегодня. Таким образом сравнение с now()  осуществляется в той же зоне, в которой находится текущий экземпляр.

Методы создания экземпляров

Существует несколько способов задействованных для создания нового экземпляра  класса Carbone.  Первый способ - использование конструктора. Он переопределяет родительский конструктор, и вам лучше всего прочитать  о первом параметре в руководстве по PHP и понять форматы даты / времени, которые он принимает. Вы, надеюсь, редко будете использовать конструктор, но также вы можете полагаться на явные статические методы для улучшения удобочитаемости.

$carbon = new Carbon();                  // равносильно Carbon::now()
$carbon = new Carbon('first day of January 2008', 'America/Vancouver');
echo get_class($carbon);                 // 'Carbon\Carbon'
$carbon = Carbon::now(-5);

Вы могли заметить, что 2 параметр (временная зона) был передан как строкой('America/Vancouver'), так и числом(-5), а не экземпляром  \DateTimeZone .  Все параметры DateTimeZone были дополнены. Вы можете передать экземпляр DateTimeZone, строковое или целочисленное смещение в GMT и часовой пояс будет создан за вас. Это показано в следующем примере:

$now = Carbon::now();

$nowInLondonTz = Carbon::now(new DateTimeZone('Europe/London'));

// или просто передайте временную зону строкой
$nowInLondonTz = Carbon::now('Europe/London');

// или передайте  число ( целочисленное смещение в GMT)
echo Carbon::now(1)->tzName;             // Europe/London

 Также вы можете  вы можете использовать метод синтаксического анализа parse().

echo (new Carbon('first day of December 2008'))->addWeeks(2);     // 2008-12-15 00:00:00
echo Carbon::parse('first day of December 2008')->addWeeks(2);    // 2008-12-15 00:00:00

Существует несколько других статических помощников для создания широко известных экземпляров. Единственное, что действительно нужно заметить, это то, что  today(), tomorrow() и yesterday() помимо обычного поведения,  все принимают параметр часового пояса, и каждый из них имеет значение времени, установленное в 00:00:00.

$now = Carbon::now();
echo $now;                               // 2016-06-24 15:18:34
$today = Carbon::today();
echo $today;                             // 2016-06-24 00:00:00
$tomorrow = Carbon::tomorrow('Europe/London');
echo $tomorrow;                          // 2016-06-25 00:00:00
$yesterday = Carbon::yesterday();
echo $yesterday;                         // 2016-06-23 00:00:00

 Следующая группа статических помощников начинается с createXXX().  Большинство из create функций   позволяет вам передать столько аргументов, сколько необходимо. Обычно  это текущая дата, время или часовой пояс. Недопустимые значения будут вызывать InvalidArgumentException с информативным сообщением. Сообщение будет получено  из вызова DateTime::getLastErrors() .

Carbon::createFromDate($year, $month, $day, $tz);
Carbon::createFromTime($hour, $minute, $second, $tz);
Carbon::create($year, $month, $day, $hour, $minute, $second, $tz);

CreateFromDate() и createFromTime()  по умолчанию будут использовать сегодняшнюю дату. Значение $tz по умолчанию относится к текущему часовому поясу, а в противном случае может быть экземпляром DateTimeZone или просто значением часового пояса. Единственный специальный случай для значений по умолчанию (имитация базовой библиотеки PHP) возникает, когда задано значение часа, но не минут или секунд, они получат значение по умолчанию 0.

$xmasThisYear = Carbon::createFromDate(null, 12, 25);  // текущий год – год по умолчанию
$Y2K = Carbon::create(2000, 1, 1, 0, 0, 0);
$alsoY2K = Carbon::create(1999, 12, 31, 24);
$noonLondonTz = Carbon::createFromTime(12, 0, 0, 'Europe/London');

// не удалось найти двузначную минуту
try { Carbon::create(1975, 5, 21, 22, -2, 0); } catch(InvalidArgumentException $x) { echo $x->getMessage(); }

CreateFromFormat().

Carbon::createFromFormat($format, $time, $tz);

В основном является оболочкой для базовой функции php DateTime::createFromFormat. Разница, опять-таки, аргумент $tz может быть экземпляром DateTimeZone или значением часового пояса. Кроме того, если появятся ошибки в формате,  то эта функция вызовет метод DateTime::getLastErrors(), а затем выбросит  InvalidArgumentException с ошибками в виде сообщения. Если вы посмотрите на функции createXX() выше, то увидите, что они все вызывают createFromFormat() .

echo Carbon::createFromFormat('Y-m-d H', '1975-05-21 22')->toDateTimeString(); // 1975-05-21 22:00:00

 Последние две функции создания предназначены для работы с временными отметками unix timestamps. Первая создаст экземпляр Carbon, равный заданной временной отметке  за вычетом 1 секунды и установит часовой пояс. По умолчанию он будет соответствовать текущему часовому поясу. Вторая, createFromTimestampUTC() отличается тем, что часовой пояс останется UTC (GMT). Вторая действует так же, как Carbon::createFromFormat('@'.$timestamp) ), но задается более явно. Также допускаются отрицательные временные метки.

echo Carbon::createFromTimestamp(-1)->toDateTimeString();                        // 1969-12-31 18:59:59
echo Carbon::createFromTimestamp(-1, 'Europe/London')->toDateTimeString();       // 1970-01-01 00:59:59
echo Carbon::createFromTimeStampUTC(-1)->toDateTimeString();                     // 1969-12-31 23:59:59

Вы также можете создать копию copy()  существующего объекта Carbon.  Дата, время и часовая зона  будут также  скопированы в новом объекте.

$dt = Carbon::now();
echo $dt->diffInYears($dt->copy()->addYear());  // 1

// $dt остался прежним и по-прежнему  содержит значение Carbon:now() 

Наконец, если вы обнаружите, что наследуете экземпляр \DateTime  из другой библиотеки, не бойтесь! Вы можете создать экземпляр Carbon через дружественную функцию instance() .

$dt = new \DateTime('first day of January 2008'); // <== экземпляр из другого API
$carbon = Carbon::instance($dt);
echo get_class($carbon);                               // 'Carbon\Carbon'
echo $carbon->toDateTimeString();                      // 2008-01-01 00:00:00

Микросекунды. Carbon поддерживает микросекунды при создании и копировании  экземпляров.

$dt = Carbon::parse('1975-05-21 22:23:00.123456');
echo $dt->micro;                                       // 123456
echo $dt->copy()->micro;                               // 123456

Carbon помогает установить начальные максимальные / минимальные значения дат.  Для этого есть два помощника, чтобы ваше решение было простым:

echo Carbon::maxValue();                               // '2038-01-18 22:14:07'
echo Carbon::minValue();                               // '1901-12-13 15:45:52'

Локализация

К несчастью базовый класс DateTime не имеет поддержки локализаций. Для поддержки локализаций был добавлен метод formatLocalized($format). Реализация осуществляет вызов strftime, используя текущую временную метку экземпляра. Если вы сначала установите текущую локаль с помощью функции PHP setlocale (), то возвращаемая строка будет отформатирована в правильной локализации.

setlocale(LC_TIME, 'German');
echo $dt->formatLocalized('%A %d %B %Y');          // Mittwoch 21 Mai 1975
setlocale(LC_TIME, '');
echo $dt->formatLocalized('%A %d %B %Y');          // Wednesday 21 May 1975

DiffForHumans() было также локализовано. Вы можете установить Carbon локализацию, используя статический метод Carbon::setLocale().

Carbon::setLocale('de');
echo Carbon::now()->addYear()->diffForHumans();    // in 1 Jahr

Carbon::setLocale('en');

на Linux

Если у вас возникли проблемы с переводом, проверьте локализацию установленную в вышей системе
locale -a список активных локализаций
sudo locale-gen fr_FR.UTF-8 установить новую локализацию.
sudo dpkg-reconfigure locales опубликовать все локализации.
Перезагрузите систему.

Тестирование

 Иногда появляется необходимость тестирования кода  при наступлении какого-то определенного времени. Например, в случае имитации наступления Дня Рождения и т.д. Методы тестирования позволяют нам это сделать. Теперь при вызове метода  now () нам будет возвращена тестируемая дата.

$knownDate = Carbon::create(2001, 5, 21, 12);          // тестируемая дата
Carbon::setTestNow($knownDate);                        //старт тестового сеанса 
echo Carbon::now();                                    // 2001-05-21 12:00:00
echo new Carbon();                                     // 2001-05-21 12:00:00
echo Carbon::parse();                                  // 2001-05-21 12:00:00
echo new Carbon('now');                                // 2001-05-21 12:00:00
echo Carbon::parse('now');                             // 2001-05-21 12:00:00
var_dump(Carbon::hasTestNow());                        // bool(true)
Carbon::setTestNow();                                  // завершение тестового сеанса
var_dump(Carbon::hasTestNow());                        // bool(false)
echo Carbon::now();                                    // 2016-06-24 15:18:34

Более развернутый пример:

class SeasonalProduct
{
    protected $price;

    public function __construct($price)
    {
        $this->price = $price;
    }

    public function getPrice() {
        $multiplier = 1;
        if (Carbon::now()->month == 12) {
            $multiplier = 2;
        }

        return $this->price * $multiplier;
    }
}

$product = new SeasonalProduct(100);
Carbon::setTestNow(Carbon::parse('first day of March 2000'));
echo $product->getPrice();                                             // 100
Carbon::setTestNow(Carbon::parse('first day of December 2000'));
echo $product->getPrice();                                             // 200
Carbon::setTestNow(Carbon::parse('first day of May 2000'));
echo $product->getPrice();                                             // 100
Carbon::setTestNow();

Относительные модификаторы также работают в тестовом сеансе.

$knownDate = Carbon::create(2001, 5, 21, 12);          // тестируемая дата
Carbon::setTestNow($knownDate);                        // старт сеанса
echo new Carbon('tomorrow');                           // 2001-05-22 00:00:00  ... notice the time !
echo new Carbon('yesterday');                          // 2001-05-20 00:00:00
echo new Carbon('next wednesday');                     // 2001-05-23 00:00:00
echo new Carbon('last friday');                        // 2001-05-18 00:00:00
echo new Carbon('this thursday');                      // 2001-05-24 00:00:00
Carbon::setTestNow();                                  

Список слов, которые считаются относительными модификаторами:

  • this
  • next
  • last
  • tomorrow
  • yesterday
  • +
  • -
  • first
  • last
  • ago

Помните, что некоторые из этих модификаторов будут устанавливать время в 00:00:00.

Getters

Getters реализуют PHP метод  __get() . Метод позволяет получить значения, как если бы это было обычное свойство.

$dt = Carbon::parse('2012-9-5 23:26:11.123789');

// Эти getters возвращают целые числа, то есть intval()
var_dump($dt->year);                                         // int(2012)
var_dump($dt->month);                                        // int(9)
var_dump($dt->day);                                          // int(5)
var_dump($dt->hour);                                         // int(23)
var_dump($dt->minute);                                       // int(26)
var_dump($dt->second);                                       // int(11)
var_dump($dt->micro);                                        // int(123789)
var_dump($dt->dayOfWeek);                                    // int(3)
var_dump($dt->dayOfYear);                                    // int(248)
var_dump($dt->weekOfMonth);                                  // int(1)
var_dump($dt->weekOfYear);                                   // int(36)
var_dump($dt->daysInMonth);                                  // int(30)
var_dump($dt->timestamp);                                    // int(1346901971)
var_dump(Carbon::createFromDate(1975, 5, 21)->age);          // int(41) вычеслена разница от now()  в той же временной зоне
var_dump($dt->quarter);                                      // int(3)

// Возвращает разницу int секунд от UTC (+/- учитывая знак)
var_dump(Carbon::createFromTimestampUTC(0)->offset);         // int(0)
var_dump(Carbon::createFromTimestamp(0)->offset);            // int(-18000)

// Возвращает разницу int в часах от UTC (+/- учитывая знак)
var_dump(Carbon::createFromTimestamp(0)->offsetHours);       // int(-5)

// Индикатор перехода на зимнее время
var_dump(Carbon::createFromDate(2012, 1, 1)->dst);           // bool(false)
var_dump(Carbon::createFromDate(2012, 9, 1)->dst);           // bool(true)

// Индикатор нахождения в той же часовой зоне
var_dump(Carbon::now()->local);                              // bool(true)
var_dump(Carbon::now('America/Vancouver')->local);           // bool(false)

// Индикатор нахождения в зоне UTC
var_dump(Carbon::now()->utc);                                // bool(false)
var_dump(Carbon::now('Europe/London')->utc);                 // bool(false)
var_dump(Carbon::createFromTimestampUTC(0)->utc);            // bool(true)

// Возвращение экземпляра DateTimeZone
echo get_class(Carbon::now()->timezone);                     // DateTimeZone
echo get_class(Carbon::now()->tz);                           // DateTimeZone

// Возвращение имени экземпляра DateTimeZone, сокращение для ->timezone->getName()
echo Carbon::now()->timezoneName;                            // America/Toronto
echo Carbon::now()->tzName;                                  

Setters

Setters реализуют PHP метод  __set() .


$dt->year = 1975;
$dt->month = 13;             // увеличит год на 1 и установит 1 месяц
$dt->month = 5;
$dt->day = 21;
$dt->hour = 22;
$dt->minute = 32;
$dt->second = 5;

$dt->timestamp = 169957925;  // временная зона не изменится

//  Устанавливает временную зону с помощью экземпляра DateTimeZone или строки
$dt->timezone = new DateTimeZone('Europe/London');
$dt->timezone = 'Europe/London';
$dt->tz = 'Europe/London';

Гибкие Setters

Существует большое число  интуитивно понятных вариаций установки значений.

$dt = Carbon::now();

$dt->year(1975)->month(5)->day(21)->hour(22)->minute(32)->second(5)->toDateTimeString();
$dt->setDate(1975, 5, 21)->setTime(22, 32, 5)->toDateTimeString();
$dt->setDateTime(1975, 5, 21, 22, 32, 5)->toDateTimeString();

$dt->timestamp(169957925)->timezone('Europe/London');

$dt->tz('America/Toronto')->setTimezone('America/Vancouver');

IsSet

Реализована PHP функция __isset() . Метод был реализован, так как некоторые внешние системы (например, Twig) подтверждают наличие свойства перед его использованием. Реализовано с помощью методов isset () или empty (). 

var_dump(isset(Carbon::now()->iDoNotExist));       // bool(false)
var_dump(isset(Carbon::now()->hour));              // bool(true)
var_dump(empty(Carbon::now()->iDoNotExist));       // bool(true)
var_dump(empty(Carbon::now()->year));              // bool(false)

Строковое представление

Реализован метод __toString (). Все  toXXXString() методы связаны с  базовым методом format() класса DataTime.

$dt = Carbon::create(1975, 12, 25, 14, 15, 16);

var_dump($dt->toDateTimeString() == $dt);          // bool(true) => использует __toString()
echo $dt->toDateString();                          // 1975-12-25
echo $dt->toFormattedDateString();                 // Dec 25, 1975
echo $dt->toTimeString();                          // 14:15:16
echo $dt->toDateTimeString();                      // 1975-12-25 14:15:16
echo $dt->toDayDateTimeString();                   // Thu, Dec 25, 1975 2:15 PM

// ... конечно метод format() по-прежнему доступен
echo $dt->format('l jS \\of F Y h:i:s A');         // Thursday 25th of December 1975 02:15:16 PM

Вы также можете установить свой формат __toString()  по умолчанию ( задействован: Y-m-d H:i:s).

Carbon::setToStringFormat('jS \o\f F, Y g:i:s a');
echo $dt;                                          // 25th of December, 1975 2:15:16 pm
Carbon::resetToStringFormat();
echo $dt;                                          // 1975-12-25 14:15:16

Заметьте: Для поддержки локализации смотрите секцию “локализация”.

Общие форматы

Ниже приведены обертки для общих форматов, предоставляемых классом  DateTime().

$dt = Carbon::now();

// $dt->toAtomString() то же самое как $dt->format(DateTime::ATOM);
echo $dt->toAtomString();      // 1975-12-25T14:15:16-05:00
echo $dt->toCookieString();    // Thursday, 25-Dec-1975 14:15:16 EST
echo $dt->toIso8601String();   // 1975-12-25T14:15:16-0500
echo $dt->toRfc822String();    // Thu, 25 Dec 75 14:15:16 -0500
echo $dt->toRfc850String();    // Thursday, 25-Dec-75 14:15:16 EST
echo $dt->toRfc1036String();   // Thu, 25 Dec 75 14:15:16 -0500
echo $dt->toRfc1123String();   // Thu, 25 Dec 1975 14:15:16 -0500
echo $dt->toRfc2822String();   // Thu, 25 Dec 1975 14:15:16 -0500
echo $dt->toRfc3339String();   // 1975-12-25T14:15:16-05:00
echo $dt->toRssString();       // Thu, 25 Dec 1975 14:15:16 -0500
echo $dt->toW3cString();       // 1975-12-25T14:15:16-05:00

Сравнение

 Простое сравнение предложено с помощью следующих функций. Помните, что сравнение сделано во временной зоне UTC.

echo Carbon::now()->tzName;                        // America/Toronto
$first = Carbon::create(2012, 9, 5, 23, 26, 11);
$second = Carbon::create(2012, 9, 5, 20, 26, 11, 'America/Vancouver');
echo $dtVancouver->diffInHours($dtToronto); // 3 – разница в часах

echo $first->toDateTimeString();                   // 2012-09-05 23:26:11
echo $first->tzName;                               // America/Toronto
echo $second->toDateTimeString();                  // 2012-09-05 20:26:11
echo $second->tzName;                              // America/Vancouver

var_dump($first->eq($second));                     // bool(true)
var_dump($first->ne($second));                     // bool(false)
var_dump($first->gt($second));                     // bool(false)
var_dump($first->gte($second));                    // bool(true)
var_dump($first->lt($second));                     // bool(false)
var_dump($first->lte($second));                    // bool(true)

$first->setDateTime(2012, 1, 1, 0, 0, 0);
$second->setDateTime(2012, 1, 1, 0, 0, 0);         // помните tz 'America/Vancouver'

var_dump($first->eq($second));                     // bool(false)
var_dump($first->ne($second));                     // bool(true)
var_dump($first->gt($second));                     // bool(false)
var_dump($first->gte($second));                    // bool(false)
var_dump($first->lt($second));                     // bool(true)
var_dump($first->lte($second));                    // bool(true)

Еq("="),nq("!=") gte(">="), gt(">"), lt("<"), lte("<=").

Чтобы определить, находится ли текущий экземпляр между двумя другими экземплярами, вы можете использовать метод between(). Третий параметр(по умолчанию – true) допускает нахождение на границе. При значении false  текущий экземпляр должен быть между границами.

$first = Carbon::create(2012, 9, 5, 1);
$second = Carbon::create(2012, 9, 5, 5);
var_dump(Carbon::create(2012, 9, 5, 3)->between($first, $second));          // bool(true)
var_dump(Carbon::create(2012, 9, 5, 5)->between($first, $second));          // bool(true)
var_dump(Carbon::create(2012, 9, 5, 5)->between($first, $second, false));   // bool(false)

Методы min() и max(). Если ничего не указано, то по умолчанию сравнивается с now().

$dt1 = Carbon::create(2012, 1, 1, 0, 0, 0);
$dt2 = Carbon::create(2014, 1, 30, 0, 0, 0);
echo $dt1->min($dt2);                              // 2012-01-01 00:00:00

$dt1 = Carbon::create(2012, 1, 1, 0, 0, 0);
$dt2 = Carbon::create(2014, 1, 30, 0, 0, 0);
echo $dt1->max($dt2);                              // 2014-01-30 00:00:00

// если не передан параметр (по умолчанию)
$dt1 = Carbon::create(2000, 1, 1, 0, 0, 0);
echo $dt1->max();                                  // 2016-06-24 15:18:34

 Для обработки наиболее часто используемых случаев существуют некоторые простые вспомогательные функции, которые, имеют интуитивные названия. Для методов, которые сравниваются с now () (например, isToday ()). now () создается в том же часовом поясе, что и экземпляр.

$dt = Carbon::now();

$dt->isWeekday();
$dt->isWeekend();
$dt->isYesterday();
$dt->isToday();
$dt->isTomorrow();
$dt->isFuture();
$dt->isPast();
$dt->isLeapYear();
$dt->isSameDay(Carbon::now());
$born = Carbon::createFromDate(1987, 4, 23);
$noCake = Carbon::createFromDate(2014, 9, 26);
$yesCake = Carbon::createFromDate(2014, 4, 23);
$overTheHill = Carbon::now()->subYears(50);
var_dump($born->isBirthday($noCake));              // bool(false)
var_dump($born->isBirthday($yesCake));             // bool(true)
var_dump($overTheHill->isBirthday());              // bool(true) -> по умолчанию сравнивается с сегодня!

Добавления и вычитания

По умолчанию DateTime предоставляет несколько различных методов для простого добавления и вычитания времени. Есть modify(), add() и  sub(). 

$dt = Carbon::create(2012, 1, 31, 0);

echo $dt->toDateTimeString();            // 2012-01-31 00:00:00

echo $dt->addYears(5);                   // 2017-01-31 00:00:00
echo $dt->addYear();                     // 2018-01-31 00:00:00
echo $dt->subYear();                     // 2017-01-31 00:00:00
echo $dt->subYears(5);                   // 2012-01-31 00:00:00

echo $dt->addMonths(60);                 // 2017-01-31 00:00:00
echo $dt->addMonth();                    // 2017-03-03 00:00:00 эквивалентно $dt->month($dt->month + 1); 
echo $dt->subMonth();                    // 2017-02-03 00:00:00
echo $dt->subMonths(60);                 // 2012-02-03 00:00:00

echo $dt->addDays(29);                   // 2012-03-03 00:00:00
echo $dt->addDay();                      // 2012-03-04 00:00:00
echo $dt->subDay();                      // 2012-03-03 00:00:00
echo $dt->subDays(29);                   // 2012-02-03 00:00:00

echo $dt->addWeekdays(4);                // 2012-02-09 00:00:00
echo $dt->addWeekday();                  // 2012-02-10 00:00:00
echo $dt->subWeekday();                  // 2012-02-09 00:00:00
echo $dt->subWeekdays(4);                // 2012-02-03 00:00:00

echo $dt->addWeeks(3);                   // 2012-02-24 00:00:00
echo $dt->addWeek();                     // 2012-03-02 00:00:00
echo $dt->subWeek();                     // 2012-02-24 00:00:00
echo $dt->subWeeks(3);                   // 2012-02-03 00:00:00

echo $dt->addHours(24);                  // 2012-02-04 00:00:00
echo $dt->addHour();                     // 2012-02-04 01:00:00
echo $dt->subHour();                     // 2012-02-04 00:00:00
echo $dt->subHours(24);                  // 2012-02-03 00:00:00

echo $dt->addMinutes(61);                // 2012-02-03 01:01:00
echo $dt->addMinute();                   // 2012-02-03 01:02:00
echo $dt->subMinute();                   // 2012-02-03 01:01:00
echo $dt->subMinutes(61);                // 2012-02-03 00:00:00

echo $dt->addSeconds(61);                // 2012-02-03 00:01:01
echo $dt->addSecond();                   // 2012-02-03 00:01:02
echo $dt->subSecond();                   // 2012-02-03 00:01:01
echo $dt->subSeconds(61);                // 2012-02-03 00:00:00

Также можно передавать отрицательные значения, это будет эквивалентно subXXX() .

Разница

Эти функции всегда возвращают общую разницу. Это отличается от функции diff(). базового класса, где интервал в 61 секунду будет возвращен как 1 минута и 1 секунда через экземпляр DateInterval. Функция diffInMinuts() просто вернет 1. Все значения усечены и не округлены. Каждая функция, представленная ниже, имеет первый параметр по умолчанию, который является экземпляром Carbon или null, если вы хотите использовать now (). Второй параметр снова является необязательным и указывает, хотите ли вы, чтобы возвращаемое значение являлось абсолютным значением или относительным значением, которое может иметь знак - (отрицательный), если прошедшая дата меньше текущего экземпляра. Значение по умолчанию true, вернется абсолютное значение. Сравнение проводится в формате UTC.

// Carbon::diffInYears(Carbon $dt = null, $abs = true)

echo Carbon::now('America/Vancouver')->diffInSeconds(Carbon::now('Europe/London')); // 0

$dtOttawa = Carbon::createFromDate(2000, 1, 1, 'America/Toronto');
$dtVancouver = Carbon::createFromDate(2000, 1, 1, 'America/Vancouver');
echo $dtOttawa->diffInHours($dtVancouver);                             // 3

echo $dtOttawa->diffInHours($dtVancouver, false);                      // 3
echo $dtVancouver->diffInHours($dtOttawa, false);                      // -3

$dt = Carbon::create(2012, 1, 31, 0);
echo $dt->diffInDays($dt->copy()->addMonth());                         // 31
echo $dt->diffInDays($dt->copy()->subMonth(), false);                  // -31

$dt = Carbon::create(2012, 4, 30, 0);
echo $dt->diffInDays($dt->copy()->addMonth());                         // 30
echo $dt->diffInDays($dt->copy()->addWeek());                          // 7

$dt = Carbon::create(2012, 1, 1, 0);
echo $dt->diffInMinutes($dt->copy()->addSeconds(59));                  // 0
echo $dt->diffInMinutes($dt->copy()->addSeconds(60));                  // 1
echo $dt->diffInMinutes($dt->copy()->addSeconds(119));                 // 1
echo $dt->diffInMinutes($dt->copy()->addSeconds(120));                 // 2

echo $dt->addSeconds(120)->secondsSinceMidnight();                     // 120

Существуют также специальные функции фильтрации diffInDaysFiltered(), diffInHoursFiltered() и diffFiltered(), которые помогут вам отфильтровать разницу по дням, часам или пользовательскому интервалу. Например, чтобы подсчитать выходные дни между двумя экземплярами:

$dt = Carbon::create(2014, 1, 1);
$dt2 = Carbon::create(2014, 12, 31);
$daysForExtraCoding = $dt->diffInDaysFiltered(function(Carbon $date) {
   return $date->isWeekend();
}, $dt2);

echo $daysForExtraCoding;      // 104

$dt = Carbon::create(2014, 1, 1)->startOfDay();
$dt2 = $dt->copy()->endOfDay();
$littleHandRotations = $dt->diffFiltered(CarbonInterval::minute(), function(Carbon $date) {
   return $date->minute === 0;
}, $dt2);

echo $littleHandRotations;     // 24

// others that are defined
// diffInYears(), diffInMonths(), diffInWeeks()
// diffInDays(), diffInWeekdays(), diffInWeekendDays()
// diffInHours(), diffInMinutes(), diffInSeconds()
// secondsSinceMidnight(), secondsUntilEndOfDay()

Разница для людей

Человеку легче воспринять запись 1 месяц назад, чем 30 дней назад. Единственный аргумент для функции - это другой экземпляр Carbon для сравнения, и, разумеется, по умолчанию он now(), если не указан.

Есть 4 способа указать разницу:

  • Когда сравнивается значение в прошлом и  now:
    • 1 hour ago
    • 5 months ago
  • Когда сравнивается значение в будущем и now:
    • 1 hour from now
    • 5 months from now
  • Когда сравниваются 2 значения в прошлом:
    • 1 hour before
    • 5 months before
  • Когда сравниваются 2 значения в будущем:
    • 1 hour after
    • 5 months after

Вы также можете передать 2-ой параметр true , чтобы удалить модификаторы agofrom now, etc

diffForHumans(Carbon $other, true):

// Примеры использования
echo Carbon::now()->subDays(5)->diffForHumans();               // 5 days ago

echo Carbon::now()->diffForHumans(Carbon::now()->subYear());   // 1 year after

$dt = Carbon::createFromDate(2011, 8, 1);

echo $dt->diffForHumans($dt->copy()->addMonth());              // 1 month before
echo $dt->diffForHumans($dt->copy()->subMonth());              // 1 month after

echo Carbon::now()->addSeconds(5)->diffForHumans();            // 5 seconds from now

echo Carbon::now()->subDays(24)->diffForHumans();              // 3 weeks ago
echo Carbon::now()->subDays(24)->diffForHumans(null, true);    // 3 weeks

Также вы можете изменить локализацию, используя Carbon::setLocale('fr') до использования diffForHumans() . Смотри раздел “Локализации”.

Модификаторы

Эта группа методов выполняет полезные изменения для текущего экземпляра. Большинство из них сами объясняют свои имена или, по крайней мере, должны это делать. Вы также заметите, что методы startOfXXX (), next () и previous () устанавливают время до 00:00:00, а методы endOfXXX () устанавливают время до 23:59:59. Единственное, что немного отличается, это функция average() . Он перемещает ваш экземпляр до средней даты между самой собой и предоставленным аргументом.

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfDay();                            // 2012-01-31 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfDay();                              // 2012-01-31 23:59:59

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfMonth();                          // 2012-01-01 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfMonth();                            // 2012-01-31 23:59:59

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfYear();                           // 2012-01-01 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfYear();                             // 2012-12-31 23:59:59

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfDecade();                         // 2010-01-01 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfDecade();                           // 2019-12-31 23:59:59

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfCentury();                        // 2000-01-01 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfCentury();                          // 2099-12-31 23:59:59

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfWeek();                           // 2012-01-30 00:00:00
var_dump($dt->dayOfWeek == Carbon::MONDAY);        // bool(true) : ISO8601 week starts on Monday

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfWeek();                             // 2012-02-05 23:59:59
var_dump($dt->dayOfWeek == Carbon::SUNDAY);        // bool(true) : ISO8601 week ends on Sunday

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->next(Carbon::WEDNESDAY);                 // 2012-02-01 00:00:00
var_dump($dt->dayOfWeek == Carbon::WEDNESDAY);     // bool(true)

$dt = Carbon::create(2012, 1, 1, 12, 0, 0);
echo $dt->next();                                  // 2012-01-08 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->previous(Carbon::WEDNESDAY);             // 2012-01-25 00:00:00
var_dump($dt->dayOfWeek == Carbon::WEDNESDAY);     // bool(true)

$dt = Carbon::create(2012, 1, 1, 12, 0, 0);
echo $dt->previous();                              // 2011-12-25 00:00:00

$start = Carbon::create(2014, 1, 1, 0, 0, 0);
$end = Carbon::create(2014, 1, 30, 0, 0, 0);
echo $start->average($end);                        // 2014-01-15 12:00:00

// others that are defined that are similar
//   firstOfMonth(), lastOfMonth(), nthOfMonth()
//   firstOfQuarter(), lastOfQuarter(), nthOfQuarter()
//   firstOfYear(), lastOfYear(), nthOfYear()

Константы

Следующие константы определены в классе Carbon.

// Эти getters возвращают целочисленные значения, то есть intval()
var_dump(Carbon::SUNDAY);                          // int(0)
var_dump(Carbon::MONDAY);                          // int(1)
var_dump(Carbon::TUESDAY);                         // int(2)
var_dump(Carbon::WEDNESDAY);                       // int(3)
var_dump(Carbon::THURSDAY);                        // int(4)
var_dump(Carbon::FRIDAY);                          // int(5)
var_dump(Carbon::SATURDAY);                        // int(6)

var_dump(Carbon::YEARS_PER_CENTURY);               // int(100)
var_dump(Carbon::YEARS_PER_DECADE);                // int(10)
var_dump(Carbon::MONTHS_PER_YEAR);                 // int(12)
var_dump(Carbon::WEEKS_PER_YEAR);                  // int(52)
var_dump(Carbon::DAYS_PER_WEEK);                   // int(7)
var_dump(Carbon::HOURS_PER_DAY);                   // int(24)
var_dump(Carbon::MINUTES_PER_HOUR);                // int(60)
var_dump(Carbon::SECONDS_PER_MINUTE);              // int(60)
$dt = Carbon::createFromDate(2012, 10, 6);
if ($dt->dayOfWeek === Carbon::SATURDAY) {
    echo 'Ставьте ставки на сенаторов Оттавы!';
}

Интервалы

Carbon класс наследует PHP DateInterval класс.


class CarbonInterval extends \DateInterval
{
    // code here
}

Вы можете создать экземпляр следующими способами.

 

echo CarbonInterval::year();                           // 1 year
echo CarbonInterval::months(3);                        // 3 months
echo CarbonInterval::days(3)->seconds(32);             // 3 days 32 seconds
echo CarbonInterval::weeks(3);                         // 3 weeks
echo CarbonInterval::days(23);                         // 3 weeks 2 days
echo CarbonInterval::create(2, 0, 5, 1, 1, 2, 7);      // 2 years 5 weeks 1 day 1 hour 2 minutes 7 seconds

Если вы обнаружите, что наследуете экземпляр \DateInterval  из другой библиотеки, не бойтесь! Вы можете создать экземпляр CarbonInterval с помощью дружественной функции instance() .

$di = new \DateInterval('P1Y2M'); // <== экземпляр из другого API
$ci = CarbonInterval::instance($di);
echo get_class($ci);                                   // 'Carbon\CarbonInterval'
echo $ci;                                              // 1 year 2 months

Другие помощники. Будьте внимательны с неделями и одновременно указанными днями. Будут учитываться только дни

echo CarbonInterval::year()->years;                    // 1
echo CarbonInterval::year()->dayz;                     // 0
echo CarbonInterval::days(24)->dayz;                   // 24
echo CarbonInterval::days(24)->daysExcludeWeeks;       // 3
echo CarbonInterval::weeks(3)->days(14)->weeks;        // 2  <-- days setter перезаписал значение
echo CarbonInterval::weeks(3)->weeks;                  // 3
echo CarbonInterval::minutes(3)->weeksAndDays(2, 5);   // 2 недели 5 дней 3 минуты

Есть также обработчик  forHumans(),  реализующий метод__toString() .

CarbonInterval::setLocale('fr');
echo CarbonInterval::create(2, 1)->forHumans();        // 2 ans 1 mois
echo CarbonInterval::hour()->seconds(3);               // 1 heure 3 secondes
CarbonInterval::setLocale('en');

Как вы могли заметить, локализация задается с помощью метода CarbonInterval::setLocale('fr').

КОММЕНТАРИИ

спс

Иван 9 месяцев назад

0 0

Ответить