You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
6.1 KiB
153 lines
6.1 KiB
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* This file is part of the Carbon package.
|
|
*
|
|
* (c) Brian Nesbitt <brian@nesbot.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Tests\CarbonTimeZone;
|
|
|
|
use Carbon\Carbon;
|
|
use Carbon\CarbonTimeZone;
|
|
use DateTimeZone;
|
|
use Generator;
|
|
use InvalidArgumentException;
|
|
use PHPUnit\Framework\Attributes\DataProvider;
|
|
use stdClass;
|
|
use Tests\AbstractTestCaseWithOldNow;
|
|
|
|
class ConversionsTest extends AbstractTestCaseWithOldNow
|
|
{
|
|
public function testToString()
|
|
{
|
|
$this->assertSame('+06:00', (string) (new CarbonTimeZone(6)));
|
|
$this->assertSame('Europe/Paris', (string) (new CarbonTimeZone('Europe/Paris')));
|
|
}
|
|
|
|
public function testToRegionName()
|
|
{
|
|
$this->assertSame('America/Chicago', (new CarbonTimeZone(-5))->toRegionName());
|
|
$this->assertSame('America/Toronto', (new CarbonTimeZone('America/Toronto'))->toRegionName());
|
|
$this->assertSame('America/New_York', (new CarbonTimeZone('America/Toronto'))->toOffsetTimeZone()->toRegionName());
|
|
$this->assertNull((new CarbonTimeZone(-15))->toRegionName());
|
|
$date = Carbon::parse('2018-12-20');
|
|
$this->assertSame('America/Chicago', (new CarbonTimeZone('America/Toronto'))->toOffsetTimeZone($date)->toRegionName($date));
|
|
$date = Carbon::parse('2020-06-11T12:30:00-02:30');
|
|
$this->assertSame('America/St_Johns', $date->getTimezone()->toRegionName($date));
|
|
}
|
|
|
|
public function testToRegionTimeZone()
|
|
{
|
|
$this->assertSame('America/Chicago', (new CarbonTimeZone(-5))->toRegionTimeZone()->getName());
|
|
$this->assertSame('America/Toronto', (new CarbonTimeZone('America/Toronto'))->toRegionTimeZone()->getName());
|
|
$this->assertSame('America/New_York', (new CarbonTimeZone('America/Toronto'))->toOffsetTimeZone()->toRegionTimeZone()->getName());
|
|
$date = Carbon::parse('2018-12-20');
|
|
$this->assertSame('America/Chicago', (new CarbonTimeZone('America/Toronto'))->toOffsetTimeZone($date)->toRegionTimeZone($date)->getName());
|
|
}
|
|
|
|
public static function dataForToOffsetName(): Generator
|
|
{
|
|
// timezone - number
|
|
yield ['2018-12-20', '-05:00', -5];
|
|
yield ['2018-06-20', '-05:00', -5];
|
|
// timezone - use offset
|
|
yield ['2018-12-20', '-05:00', '-05:00'];
|
|
yield ['2018-06-20', '-05:00', '-05:00'];
|
|
// timezone - by name - with daylight time
|
|
yield ['2018-12-20', '-05:00', 'America/Toronto'];
|
|
yield ['2018-06-20', '-04:00', 'America/Toronto'];
|
|
// timezone - by name - without daylight time
|
|
yield ['2018-12-20', '+03:00', 'Asia/Baghdad'];
|
|
yield ['2018-06-20', '+03:00', 'Asia/Baghdad'];
|
|
// timezone - no full hour - the same time
|
|
yield ['2018-12-20', '-09:30', 'Pacific/Marquesas'];
|
|
yield ['2018-06-20', '-09:30', 'Pacific/Marquesas'];
|
|
// timezone - no full hour -
|
|
yield ['2018-12-20', '-03:30', 'America/St_Johns'];
|
|
yield ['2018-06-20', '-02:30', 'America/St_Johns'];
|
|
// timezone - no full hour +
|
|
yield ['2018-12-20', '+13:45', 'Pacific/Chatham'];
|
|
yield ['2018-06-20', '+12:45', 'Pacific/Chatham'];
|
|
// timezone - UTC
|
|
yield ['2018-12-20', '+00:00', 'UTC'];
|
|
yield ['2018-06-20', '+00:00', 'UTC'];
|
|
}
|
|
|
|
#[DataProvider('dataForToOffsetName')]
|
|
public function testToOffsetName(string $date, string $expectedOffset, string|int $timezone)
|
|
{
|
|
Carbon::setTestNow(Carbon::parse($date));
|
|
$offset = (new CarbonTimeZone($timezone))->toOffsetName();
|
|
|
|
$this->assertSame($expectedOffset, $offset);
|
|
}
|
|
|
|
#[DataProvider('dataForToOffsetName')]
|
|
public function testToOffsetNameDateAsParam(string $date, string $expectedOffset, string|int $timezone)
|
|
{
|
|
$offset = (new CarbonTimeZone($timezone))->toOffsetName(Carbon::parse($date));
|
|
|
|
$this->assertSame($expectedOffset, $offset);
|
|
}
|
|
|
|
public function testToOffsetNameFromDifferentCreationMethods()
|
|
{
|
|
$summer = Carbon::parse('2020-06-15');
|
|
$winter = Carbon::parse('2018-12-20');
|
|
$this->assertSame('+02:00', (new CarbonTimeZone('Europe/Paris'))->toOffsetName());
|
|
$this->assertSame('+05:30', $this->firstValidTimezoneAmong(['Asia/Kolkata', 'Asia/Calcutta'])->toOffsetName());
|
|
$this->assertSame('+13:45', CarbonTimeZone::create('Pacific/Chatham')->toOffsetName($winter));
|
|
$this->assertSame('+12:00', CarbonTimeZone::create('Pacific/Auckland')->toOffsetName($summer));
|
|
$this->assertSame('-05:15', CarbonTimeZone::createFromHourOffset(-5.25)->toOffsetName());
|
|
$this->assertSame('-02:30', CarbonTimeZone::createFromMinuteOffset(-150)->toOffsetName());
|
|
$this->assertSame('-08:45', CarbonTimeZone::create('-8:45')->toOffsetName());
|
|
$this->assertSame('-09:30', CarbonTimeZone::create('Pacific/Marquesas')->toOffsetName());
|
|
}
|
|
|
|
public function testCast()
|
|
{
|
|
$tz = (new CarbonTimeZone('America/Toronto'))->cast(DateTimeZone::class);
|
|
|
|
$this->assertSame(DateTimeZone::class, \get_class($tz));
|
|
$this->assertSame('America/Toronto', $tz->getName());
|
|
|
|
$obj = new class('UTC') extends CarbonTimeZone {
|
|
};
|
|
$class = \get_class($obj);
|
|
|
|
$tz = (new CarbonTimeZone('America/Toronto'))->cast($class);
|
|
|
|
$this->assertSame($class, \get_class($tz));
|
|
$this->assertSame('America/Toronto', $tz->getName());
|
|
}
|
|
|
|
public function testCastException()
|
|
{
|
|
$this->expectExceptionObject(new InvalidArgumentException(
|
|
'stdClass has not the instance() method needed to cast the date.',
|
|
));
|
|
|
|
(new CarbonTimeZone('America/Toronto'))->cast(stdClass::class);
|
|
}
|
|
|
|
public function testInvalidRegionForOffset()
|
|
{
|
|
Carbon::useStrictMode(false);
|
|
$this->assertNull((new CarbonTimeZone(-15))->toRegionTimeZone());
|
|
}
|
|
|
|
public function testInvalidRegionForOffsetInStrictMode()
|
|
{
|
|
$this->expectExceptionObject(new InvalidArgumentException(
|
|
'Unknown timezone for offset -54000 seconds.',
|
|
));
|
|
|
|
(new CarbonTimeZone(-15))->toRegionTimeZone();
|
|
}
|
|
}
|
|
|