Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
CRAP | |
0.00% |
0 / 45 |
MankindImperialCalendar | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
56 | |
0.00% |
0 / 45 |
format | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 22 |
|||
formatDateRepresentation | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
parse | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 17 |
|||
parseToDateRepresentation | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
<?php | |
namespace Popy\Calendar\Calendar; | |
use DateTimeZone; | |
use RuntimeException; | |
use DateTimeImmutable; | |
use DateTimeInterface; | |
use Popy\Calendar\CalendarInterface; | |
use Popy\Calendar\ValueObject\DateRepresentationInterface; | |
/** | |
* Simple implementation of the Warhammer 40k Imperial calendar. | |
*/ | |
class MankindImperialCalendar implements CalendarInterface | |
{ | |
/** | |
* @inheritDoc | |
*/ | |
public function format(DateTimeInterface $input, $format) | |
{ | |
if (!$input instanceof DateTimeImmutable) { | |
$input = DateTimeImmutable::createFromMutable($input); | |
} | |
// While DateTimeInterface doesn't include date location, assume | |
// that it's a terran time. | |
$checkNum = 0; | |
$fullYear = $input->format('Y'); | |
$millenium = ceil($fullYear / 1000); | |
$year = $fullYear % 1000; | |
$ref = $input->modify('first day of January'); | |
$yearLength = (365 + $input->format('L')) * 24 * 3600; | |
$yearFraction = intval( | |
1000 * ($input->getTimestamp() - $ref->getTimestamp()) | |
/ $yearLength | |
); | |
return sprintf( | |
'%s%03d%03d.M%02d', | |
$checkNum, | |
$yearFraction, | |
$year, | |
$millenium | |
); | |
} | |
/** | |
* @inheritDoc | |
*/ | |
public function formatDateRepresentation(DateRepresentationInterface $input, $format) | |
{ | |
throw new RuntimeException('Not implemented'); | |
} | |
/** | |
* @inheritDoc | |
*/ | |
public function parse($input, $format, DateTimeZone $timezone = null) | |
{ | |
$match = []; | |
if (!preg_match('/^(\d)(\d\d\d)(\d\d\d)\.M(\d+)$/', $input, $match)) { | |
return null; | |
} | |
$fullYear = $match[4] * 1000 + $match[3]; | |
$res = DateTimeImmutable::createFromFormat( | |
'Y-m-d', | |
'2000-01-01' | |
); | |
$res = $res | |
->modify('+' . ($fullYear - 2000) .'years') | |
; | |
$yearLength = (365 + $res->format('L')) * 24 * 3600; | |
$seconds = $match[2] * $yearLength / 1000; | |
return $res->modify('+' . $seconds . 'seconds') ?: null; | |
} | |
/** | |
* @inheritDoc | |
*/ | |
public function parseToDateRepresentation($input, $format, DateTimeZone $timezone = null) | |
{ | |
throw new RuntimeException('Not implemented'); | |
} | |
} |