

GitHub - spatie/period: Complex period comparisons
source link: https://github.com/spatie/period
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

README.md
Complex period comparisons
This package adds support for comparing multiple dates with each other. You can calculate the overlaps and differences between n-amount of periods, as well as some more basic comparisons between two periods.
Periods can be constructed from any type of DateTime
implementation,
making this package compatible with custom DateTime
implementations like Carbon.
Periods are always immutable, there's never the worry about your input dates being changed.
This package is still a work in progress.
Installation
You can install the package via composer:
composer require spatie/period
Usage
Overlaps with any other period:
this method returns a PeriodCollection
multiple Period
objects representing the overlaps.
/* * A [========] * B [==] * C [=====] * CURRENT [===============] * * OVERLAP [=] [==] [=] */ $a = Period::make('2018-01-01', '2018-01-31'); $b = Period::make('2018-02-10', '2018-02-20'); $c = Period::make('2018-03-01', '2018-03-31'); $current = Period::make('2018-01-20', '2018-03-10'); $overlaps = $current->overlap($a, $b, $c);
Overlap with all periods: this method only returns one period where all periods overlap.
/* * A [============] * B [==] * C [=======] * * OVERLAP [==] */ $a = Period::make('2018-01-01', '2018-01-31'); $b = Period::make('2018-01-10', '2018-01-15'); $c = Period::make('2018-01-10', '2018-01-31'); $overlap = $a->overlapAll($b, $c);
Diff between multiple periods:
this method returns a PeriodCollection
multiple Period
objects
representing the diffs between several periods and one.
/* * A [====] * B [========] * C [=====] * CURRENT [========================] * * DIFF [=] [====] */ $a = Period::make('2018-01-05', '2018-01-10'); $b = Period::make('2018-01-15', '2018-03-01'); $c = Period::make('2017-01-01', '2018-01-02'); $current = Period::make('2018-01-01', '2018-01-31'); $diff = $current->diff($a, $b, $c);
Overlaps with: this method returns a boolean indicating of two periods overlap or not.
/* * A [============] * B [===========] */ $a = Period::make('2018-01-01', '2018-01-31'); $b = Period::make('2018-01-10', '2018-02-15'); $overlap = $a->overlapsWith($b); // true
Touches with: this method determines if two periods touch each other.
/* * A [========] * B [===========] */ $a = Period::make('2018-01-01', '2018-01-31'); $b = Period::make('2018-02-01', '2018-02-15'); $overlap = $a->touchesWith($b); // true
Gap: returns the gap between two periods.
If no gap exists, null
is returned.
/* * A [========] * B [===========] */ $a = Period::make('2018-01-01', '2018-01-31'); $b = Period::make('2018-02-05', '2018-02-15'); $overlap = $a->gap($b); // Period('2018-02-01', '2018-02-04')
Boundaries of a collection: get one period representing the boundaries of a collection.
/* * A [====] * B [========] * C [=====] * D [====] * * BOUNDARIES [=======================================] */ $collection = new PeriodCollection( Period::make('2018-01-01', '2018-01-05'), Period::make('2018-01-10', '2018-01-15'), Period::make('2018-01-20', '2018-01-25'), Period::make('2018-01-30', '2018-01-31') ); $boundaries = $collection->boundaries();
Gaps of a collection: get all the gaps of a collection.
/* * A [====] * B [========] * C [=====] * D [====] * * GAPS [=] [====] [==] */ $collection = new PeriodCollection( Period::make('2018-01-01', '2018-01-05'), Period::make('2018-01-10', '2018-01-15'), Period::make('2018-01-20', '2018-01-25'), Period::make('2018-01-30', '2018-01-31') ); $gaps = $collection->gaps();
Overlap multiple collections: returns the overlap between collections. This means an AND operation between collections, and an OR operation within the same collection.
/* * A [=====] [===========] * B [=================] * C [====================] * * OVERLAP [=] [====] */ $a = new PeriodCollection( Period::make('2018-01-01', '2018-01-07'), Period::make('2018-01-15', '2018-01-25') ); $b = new PeriodCollection( Period::make('2018-01-01', '2018-01-20') ); $c = new PeriodCollection( Period::make('2018-01-06', '2018-01-25') ); $overlap = $a->overlap($b, $c);
Working with PeriodCollection
Period collections are constructed from several periods:
$collection = new PeriodCollection( Period::make('2018-01-01', '2018-01-02'), // … );
They may be looped over directly and its contents will be recognised by your IDE:
$collection = new PeriodCollection(/* … */); foreach ($collection as $period) { $period->… }
You may destruct them:
[$firstPeriod, $secondPeriod, $thirdPeriod] = $collection;
And finally construct one collection from another:
$newCollection = new PeriodCollection(...$otherCollection);
Compatibility
You can construct a Period
from any type of DateTime
object such as Carbon:
Period::make(Carbon::make('2018-01-01'), Carbon::make('2018-01-02'));
Note that as soon as a period is constructed, all further operations on it are immutable. There's never the danger of changing the input dates.
Testing
composer test
Changelog
Please see CHANGELOG for more information on what has changed recently.
Contributing
Please see CONTRIBUTING for details.
Security
If you discover any security related issues, please email [email protected] instead of using the issue tracker.
Postcardware
You're free to use this package, but if it makes it to your production environment we highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using.
Our address is: Spatie, Samberstraat 69D, 2060 Antwerp, Belgium.
We publish all received postcards on our company website.
Credits
Support us
Spatie is a webdesign agency based in Antwerp, Belgium. You'll find an overview of all our open source projects on our website.
Does your business depend on our contributions? Reach out and support us on Patreon. All pledges will be dedicated to allocating workforce on maintenance and new awesome stuff.
License
The MIT License (MIT). Please see License File for more information.
Recommend
-
199
-
168
-
197
-
145
-
168
THIS PACKAGE IS NOT MAINTAINED ANYMORE Alternatives: https://github.com/michaeldyrynda/laravel-efficient-uuid &
-
185
-
195
-
149
A set of useful Laravel collection macros This repository contains some useful collection macros. Spatie is a webdesign agency based in Antwerp, Belgium. You'll find an overview of all our open source projects
-
109
README.md A Laravel Nova tool to backup your application
-
13
This page contains random pieces of code and their counterparts in NGS, reminiscent of Rosetta Code. I frequently feel the need to see how a piece of code would look in NGS. H...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK