PHP Calendar Library
This repository holds interfaces defining a Calendar, whose purpose is to
manipulate (format, parse) php dates, and a few utilities and very basic
implementations., (*1)
Code Coverage, (*2)
Installation
composer require popy/calendar
Usage
format(new DateTime(), 'Y-m-d');
var_dump(
$calendar->parse('2000-01-01', 'Y-m-d')
);
?>
Output :, (*3)
2018-02-10
object(DateTimeImmutable)#2 (3) {
["date"]=>
string(26) "2000-01-01 21:28:31.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Berlin"
}
What's the point ?
A CalendarInterface basically reproduce the behaviour of DateTime::format and
DateTime::createFromFormat. the Popy\Calendar\Calendar\GregorianCalendar is only a decorator
around these methods, so, what's the point ?, (*4)
First, CalendarInterface, FormaterInterface and ParserInterface are implementable
interfaces, removing some responsibilities for classes handling dates. The PresetFormater and
PresetParser even co a step further by handling themselves the format to use, so the classes
having to deal with dates (parsing or displaying) do no longer have to deal with format or locale., (*5)
But this package containes also other components which can be used to compose a CalendarInterface
implementation, allowing to :, (*6)
- Implement a non-gregorian calendar
- Implement another formating syntax
- Extend the actual formating syntax
- Handle cases not supported by the native functions, such as parsing a date using iso8601 week &
year numbers (already implemented in the package), or parse 5+ digits years (Y10k bug)
The preset formater is a helper object taking any formater and a format as
constructor parameter, allowing to be able to format a date without knowing
which format is expected., (*7)
Inject it in any service dealing with date representation means they no longer
have the responsibility to choose the format they are using (and not even the
calendar). That's a way to have application-wide date format., (*8)
format(new DateTime());
?>
Output :, (*9)
2018-02-10
Preset Parser
The preset parser is a helper object taking any parse and a format as
constructor parameter, allowing to be able to parse a date without knowing
which format is expected., (*10)
Could be used, for instance, by a service hydrating data fetched from a
webservice, without having to know which calendar/format is used., (*11)
parse('2017-05-01'));
?>
Output :, (*12)
object(DateTimeImmutable)#2 (3) {
["date"]=>
string(26) "2017-05-01 21:28:31.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Berlin"
}
Other components