Skip to content

Commit 937efba

Browse files
authored
Merge pull request #173 from dizatech/master
Added diff method
2 parents f475f4d + c972a69 commit 937efba

File tree

3 files changed

+92
-0
lines changed

3 files changed

+92
-0
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,12 @@ public function getNextMonth(): Jalalian
639639
```
640640

641641
---
642+
```php
643+
public function diff(Jalalian $ref): array
644+
$diff = (new Jalalian(1397, 5, 24))->diff(new Jalalian(1398, 6, 30));
645+
// output: [1, 1, 6]
642646

647+
```
643648
### CalendarUtils
644649
---
645650

src/Jalalian.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,4 +754,35 @@ public function getWeekOfMonth(): int
754754
{
755755
return floor(($this->day + 5 - $this->getDayOfWeek()) / 7) + 1;
756756
}
757+
758+
public function diff(Jalalian $ref): array
759+
{
760+
if ($this->equalsTo($ref)) {
761+
return [0, 0, 0];
762+
}
763+
764+
$biggerDate = $this->greaterThan($ref) ? $this : $ref;
765+
$biggerYear = $biggerDate->getYear();
766+
$biggerMonth = $biggerDate->getMonth();
767+
$biggerDay = $biggerDate->getDay();
768+
$smallerDate = $this->greaterThan($ref) ? $ref : $this;
769+
$smallerYear = $smallerDate->getYear();
770+
$smallerMonth = $smallerDate->getMonth();
771+
$smallerDay = $smallerDate->getDay();
772+
773+
$yearDiff = $biggerYear - $smallerYear;
774+
$monthDiff = $biggerMonth - $smallerMonth;
775+
$dayDiff = $biggerDay - $smallerDay;
776+
if ($dayDiff < 0) {
777+
$dayDiff = $biggerDay +
778+
$smallerDate->getEndDayOfMonth()->getDay() - $smallerDate->getDay();
779+
$monthDiff--;
780+
}
781+
if ($monthDiff < 0) {
782+
$monthDiff += 12;
783+
$yearDiff--;
784+
}
785+
786+
return [$yearDiff, $monthDiff, $dayDiff];
787+
}
757788
}

tests/JalalianTest.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,4 +370,60 @@ public function testGetQuarter()
370370
$jDate = new Jalalian(1402, 7, 23);
371371
$this->assertEquals(3, $jDate->getQuarter());
372372
}
373+
374+
public function testdiff()
375+
{
376+
$jDate = new Jalalian(1401, 6, 26);
377+
378+
//same day
379+
$this->assertEquals($jDate->diff(new Jalalian(1401, 6, 26)), [0, 0, 0]);
380+
381+
//year before
382+
$this->assertEquals($jDate->diff(new Jalalian(1401, 6, 25)), [0, 0, 1]);
383+
384+
//day after
385+
$this->assertEquals($jDate->diff(new Jalalian(1401, 6, 27)), [0, 0, 1]);
386+
387+
//same montt, same year, before
388+
$this->assertEquals($jDate->diff(new Jalalian(1401, 6, 24)), [0, 0, 2]);
389+
390+
//same month, same year, after
391+
$this->assertEquals($jDate->diff(new Jalalian(1401, 6, 28)), [0, 0, 2]);
392+
393+
//same year, before, smaller day
394+
$this->assertEquals($jDate->diff(new Jalalian(1401, 4, 12)), [0, 2, 14]);
395+
396+
//same year, before, greater day
397+
$this->assertEquals($jDate->diff(new Jalalian(1401, 4, 27)), [0, 1, 30]);
398+
399+
//same year, after, smaller day
400+
$this->assertEquals($jDate->diff(new Jalalian(1401, 9, 10)), [0, 2, 15]);
401+
402+
//same year, after, greater day
403+
$this->assertEquals($jDate->diff(new Jalalian(1401, 10, 28)), [0, 4, 2]);
404+
405+
//previous year, smaller month, smaller day
406+
$this->assertEquals($jDate->diff(new Jalalian(1389, 4, 12)), [12, 2, 14]);
407+
408+
//previous year, smaller month, greater day
409+
$this->assertEquals($jDate->diff(new Jalalian(1395, 4, 29)), [6, 1, 28]);
410+
411+
//previous year, greater month, smaller day
412+
$this->assertEquals($jDate->diff(new Jalalian(1395, 9, 10)), [5, 9, 16]);
413+
414+
//previous year, greater month, greater day
415+
$this->assertEquals($jDate->diff(new Jalalian(1395, 9, 30)), [5, 8, 26]);
416+
417+
//greater year, smaller month, smaller day
418+
$this->assertEquals($jDate->diff(new Jalalian(1402, 4, 12)), [0, 9, 17]);
419+
420+
//greater year, smaller month, greater day
421+
$this->assertEquals($jDate->diff(new Jalalian(1403, 4, 29)), [1, 10, 3]);
422+
423+
//greater year, greater month, smaller day
424+
$this->assertEquals($jDate->diff(new Jalalian(1405, 9, 10)), [4, 2, 15]);
425+
426+
//greater year, greater month, greater day
427+
$this->assertEquals($jDate->diff(new Jalalian(1405, 9, 30)), [4, 3, 4]);
428+
}
373429
}

0 commit comments

Comments
 (0)