Carbon vs DateTime vs Symfony Clock Component

Увы нативные DateTime объекты не стольо удобны, а Symfony Clock Component:

  • новый и пока не распространен (2024 год)
  • пока не обладает таким богатым функционалом как в Carbon
  • а если брать отдельно ClockMock, то он не работает с объектами времени, только с функциями time и date

Чуть больше о Carbon

1. Удобно тестировать:

public function myFunctionProvider(): Generator
{
    $testNow = CarbonImmutable::create(); // просто создаю время (оно будет 0000-01-01 00:00:00.000000)
    CarbonImmutable::setTestNow($testNow); // говорю Карбону, что сейчас время 0000-01-01 00:00:00.000000

    yield [
        'some html v1',
        (new CarbonImmutable())->addMinutes(10), // создаю объект времени: 0000-01-01 00:10:00.000000
    ];
    yield [
        'some html v2',
        (new CarbonImmutable())->subHour(), // создаю объект времени: -0001-12-31 23:00:00.000000
    ];
    yield [
        'some html v3',
        new CarbonImmutable(), // создаю объект времени: 0000-01-01 00:00:00.000000
    ];
}

/**
 * @dataProvider myFunctionProvider
 */
public function testMyFunction(string $html, DateTimeImmutable $expected)
{
    $serviceMock = $this->getMockBuilder(MyClass::class)
        ->disableOriginalConstructor()
        ->setMethodsExcept(['myFunction'])
        ->getMock();
    // в myFunction я создаю объекты времени с помощью Carbon, например так: (new CarbonImmutable())->subHour();
    $result = $serviceMock->myFunction($html);
    $this->assertEquals($expected, $result);
}

2. Удобно смотреть разницу времени (пригодится в комментариях или новостях):

$dt = Carbon::now();
$dt->toTimeString();               // 10:10:16
$dt->toDateTimeString();           // 2015-12-19 10:10:16
$current->diffInHours($dt);        // 6
$current->diffInDays($future);     // 31
$dt->diffForHumans($future);       // через 1 месяц

3. Удобно создавать:

$dt = new Carbon('tomorrow');
$dt->month  = 04;
$dt->day    = 21;
$dt->hour   = 22;
$dt->minute = 32;
$dt->second = 5;
$dt->setDateTime(1975, 5, 21, 22, 32, 5);
$dt->setDate(1975, 5, 21)->setTime(22, 32, 5);
$dt->year(1975)->month(5)->day(21)->hour(22)->minute(32)->second(5);
Carbon::now();
new Carbon();
Carbon::today();
Carbon::yesterday();
Carbon::tomorrow();
new Carbon('first day of January 2016');
new Carbon('first day of January 2016', 'America\Pacific');

Удобно менять:

$dt = Carbon::create(2012, 1, 31, 0);
echo $dt->addYears(5);
echo $dt->addYear();
echo $dt->subYear();
echo $dt->subYears(5);
echo $dt->addMonths(60);
echo $dt->addMonth();
echo $dt->subMonth();
echo $dt->subMonths(60);
echo $dt->addDays(29);
echo $dt->addDay();
echo $dt->subDay();
echo $dt->subDays(29);
echo $dt->addWeekdays(4);
echo $dt->addWeekday();
echo $dt->subWeekday();
echo $dt->subWeekdays(4);
echo $dt->addWeeks(3);
echo $dt->addWeek();
echo $dt->subWeek();
echo $dt->subWeeks(3);
echo $dt->addHours(24);
echo $dt->addHour();
echo $dt->subHour();
echo $dt->subHours(24);
echo $dt->addMinutes(61);
echo $dt->addMinute();
echo $dt->subMinute();
echo $dt->subMinutes(61);
echo $dt->addSeconds(61);
echo $dt->addSecond();
echo $dt->subSecond();
echo $dt->subSeconds(61);

Остальные детали и фичи в документации. 


10.09.2021 21:22

Комментарии

Комментариев пока нет.


Copyrights © 2007 - 2026 YaPro.Ru