Skip to content

Commit 0cac222

Browse files
committed
Add and Subtract values from Time class.
1 parent bc114f6 commit 0cac222

2 files changed

Lines changed: 281 additions & 0 deletions

File tree

system/I18n/Time.php

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
*/
3838
use Locale;
3939
use DateTime;
40+
use DateInterval;
4041
use DateTimeZone;
4142
use IntlDateFormatter;
4243

@@ -739,6 +740,178 @@ public function setTimestamp($timestamp)
739740
return Time::parse($time, $this->timezone, $this->locale);
740741
}
741742

743+
//--------------------------------------------------------------------
744+
// Add/Subtract
745+
//--------------------------------------------------------------------
746+
747+
/**
748+
* Returns a new Time instance with $seconds added to the time.
749+
*
750+
* @param int $seconds
751+
*
752+
* @return static
753+
*/
754+
public function addSeconds(int $seconds)
755+
{
756+
$time = clone($this);
757+
758+
return $time->add(DateInterval::createFromDateString("{$seconds} seconds"));
759+
}
760+
761+
/**
762+
* Returns a new Time instance with $minutes added to the time.
763+
*
764+
* @param int $minutes
765+
*
766+
* @return static
767+
*/
768+
public function addMinutes(int $minutes)
769+
{
770+
$time = clone($this);
771+
772+
return $time->add(DateInterval::createFromDateString("{$minutes} minutes"));
773+
}
774+
775+
/**
776+
* Returns a new Time instance with $hours added to the time.
777+
*
778+
* @param int $hours
779+
*
780+
* @return static
781+
*/
782+
public function addHours(int $hours)
783+
{
784+
$time = clone($this);
785+
786+
return $time->add(DateInterval::createFromDateString("{$hours} hours"));
787+
}
788+
789+
/**
790+
* Returns a new Time instance with $days added to the time.
791+
*
792+
* @param int $days
793+
*
794+
* @return static
795+
*/
796+
public function addDays(int $days)
797+
{
798+
$time = clone($this);
799+
800+
return $time->add(DateInterval::createFromDateString("{$days} days"));
801+
}
802+
803+
/**
804+
* Returns a new Time instance with $months added to the time.
805+
*
806+
* @param int $months
807+
*
808+
* @return static
809+
*/
810+
public function addMonths(int $months)
811+
{
812+
$time = clone($this);
813+
814+
return $time->add(DateInterval::createFromDateString("{$months} months"));
815+
}
816+
817+
/**
818+
* Returns a new Time instance with $years added to the time.
819+
*
820+
* @param int $years
821+
*
822+
* @return static
823+
*/
824+
public function addYears(int $years)
825+
{
826+
$time = clone($this);
827+
828+
return $time->add(DateInterval::createFromDateString("{$years} years"));
829+
}
830+
831+
/**
832+
* Returns a new Time instance with $seconds subtracted from the time.
833+
*
834+
* @param int $seconds
835+
*
836+
* @return static
837+
*/
838+
public function subSeconds(int $seconds)
839+
{
840+
$time = clone($this);
841+
842+
return $time->add(DateInterval::createFromDateString("-{$seconds} seconds"));
843+
}
844+
845+
/**
846+
* Returns a new Time instance with $minutes subtracted from the time.
847+
*
848+
* @param int $minutes
849+
*
850+
* @return static
851+
*/
852+
public function subMinutes(int $minutes)
853+
{
854+
$time = clone($this);
855+
856+
return $time->add(DateInterval::createFromDateString("-{$minutes} minutes"));
857+
}
858+
859+
/**
860+
* Returns a new Time instance with $hours subtracted from the time.
861+
*
862+
* @param int $hours
863+
*
864+
* @return static
865+
*/
866+
public function subHours(int $hours)
867+
{
868+
$time = clone($this);
869+
870+
return $time->add(DateInterval::createFromDateString("-{$hours} hours"));
871+
}
872+
873+
/**
874+
* Returns a new Time instance with $days subtracted from the time.
875+
*
876+
* @param int $days
877+
*
878+
* @return static
879+
*/
880+
public function subDays(int $days)
881+
{
882+
$time = clone($this);
883+
884+
return $time->add(DateInterval::createFromDateString("-{$days} days"));
885+
}
886+
887+
/**
888+
* Returns a new Time instance with $months subtracted from the time.
889+
*
890+
* @param int $months
891+
*
892+
* @return static
893+
*/
894+
public function subMonths(int $months)
895+
{
896+
$time = clone($this);
897+
898+
return $time->add(DateInterval::createFromDateString("-{$months} months"));
899+
}
900+
901+
/**
902+
* Returns a new Time instance with $hours subtracted from the time.
903+
*
904+
* @param int $years
905+
*
906+
* @return static
907+
*/
908+
public function subYears(int $years)
909+
{
910+
$time = clone($this);
911+
912+
return $time->add(DateInterval::createFromDateString("-{$years} years"));
913+
}
914+
742915
//--------------------------------------------------------------------
743916
// Formatters
744917
//--------------------------------------------------------------------

tests/system/I18n/TimeTest.php

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,4 +571,112 @@ public function testToTimeString()
571571
$time = Time::parse('January 10, 2017 13:20:33', 'America/Chicago');
572572
$this->assertEquals('13:20:33', $time->toTimeString());
573573
}
574+
575+
//--------------------------------------------------------------------
576+
// Add/Subtract
577+
//--------------------------------------------------------------------
578+
579+
public function testCanAddSeconds()
580+
{
581+
$time = Time::parse('January 10, 2017 13:20:33', 'America/Chicago');
582+
$newTime = $time->addSeconds(10);
583+
$this->assertEquals('2017-01-10 13:20:33', $time->toDateTimeString());
584+
$this->assertEquals('2017-01-10 13:20:43', $newTime->toDateTimeString());
585+
}
586+
587+
public function testCanAddMinutes()
588+
{
589+
$time = Time::parse('January 10, 2017 13:20:33', 'America/Chicago');
590+
$newTime = $time->addMinutes(10);
591+
$this->assertEquals('2017-01-10 13:20:33', $time->toDateTimeString());
592+
$this->assertEquals('2017-01-10 13:30:33', $newTime->toDateTimeString());
593+
}
594+
595+
public function testCanAddHours()
596+
{
597+
$time = Time::parse('January 10, 2017 13:20:33', 'America/Chicago');
598+
$newTime = $time->addHours(3);
599+
$this->assertEquals('2017-01-10 13:20:33', $time->toDateTimeString());
600+
$this->assertEquals('2017-01-10 16:20:33', $newTime->toDateTimeString());
601+
}
602+
603+
public function testCanAddDays()
604+
{
605+
$time = Time::parse('January 10, 2017 13:20:33', 'America/Chicago');
606+
$newTime = $time->addDays(3);
607+
$this->assertEquals('2017-01-10 13:20:33', $time->toDateTimeString());
608+
$this->assertEquals('2017-01-13 13:20:33', $newTime->toDateTimeString());
609+
}
610+
611+
public function testCanAddMonths()
612+
{
613+
$time = Time::parse('January 10, 2017 13:20:33', 'America/Chicago');
614+
$newTime = $time->addMonths(3);
615+
$this->assertEquals('2017-01-10 13:20:33', $time->toDateTimeString());
616+
$this->assertEquals('2017-04-10 13:20:33', $newTime->toDateTimeString());
617+
}
618+
619+
public function testCanAddMonthsOverYearBoundary()
620+
{
621+
$time = Time::parse('January 10, 2017 13:20:33', 'America/Chicago');
622+
$newTime = $time->addMonths(13);
623+
$this->assertEquals('2017-01-10 13:20:33', $time->toDateTimeString());
624+
$this->assertEquals('2018-02-10 13:20:33', $newTime->toDateTimeString());
625+
}
626+
627+
public function testCanAddYears()
628+
{
629+
$time = Time::parse('January 10, 2017 13:20:33', 'America/Chicago');
630+
$newTime = $time->addYears(3);
631+
$this->assertEquals('2017-01-10 13:20:33', $time->toDateTimeString());
632+
$this->assertEquals('2020-01-10 13:20:33', $newTime->toDateTimeString());
633+
}
634+
635+
public function testCanSubtractSeconds()
636+
{
637+
$time = Time::parse('January 10, 2017 13:20:33', 'America/Chicago');
638+
$newTime = $time->subSeconds(10);
639+
$this->assertEquals('2017-01-10 13:20:33', $time->toDateTimeString());
640+
$this->assertEquals('2017-01-10 13:20:23', $newTime->toDateTimeString());
641+
}
642+
643+
public function testCanSubtractMinutes()
644+
{
645+
$time = Time::parse('January 10, 2017 13:20:33', 'America/Chicago');
646+
$newTime = $time->subMinutes(10);
647+
$this->assertEquals('2017-01-10 13:20:33', $time->toDateTimeString());
648+
$this->assertEquals('2017-01-10 13:10:33', $newTime->toDateTimeString());
649+
}
650+
651+
public function testCanSubtractHours()
652+
{
653+
$time = Time::parse('January 10, 2017 13:20:33', 'America/Chicago');
654+
$newTime = $time->subHours(3);
655+
$this->assertEquals('2017-01-10 13:20:33', $time->toDateTimeString());
656+
$this->assertEquals('2017-01-10 10:20:33', $newTime->toDateTimeString());
657+
}
658+
659+
public function testCanSubtractDays()
660+
{
661+
$time = Time::parse('January 10, 2017 13:20:33', 'America/Chicago');
662+
$newTime = $time->subDays(3);
663+
$this->assertEquals('2017-01-10 13:20:33', $time->toDateTimeString());
664+
$this->assertEquals('2017-01-07 13:20:33', $newTime->toDateTimeString());
665+
}
666+
667+
public function testCanSubtractMonths()
668+
{
669+
$time = Time::parse('January 10, 2017 13:20:33', 'America/Chicago');
670+
$newTime = $time->subMonths(3);
671+
$this->assertEquals('2017-01-10 13:20:33', $time->toDateTimeString());
672+
$this->assertEquals('2016-10-10 13:20:33', $newTime->toDateTimeString());
673+
}
674+
675+
public function testCanSubtractYears()
676+
{
677+
$time = Time::parse('January 10, 2017 13:20:33', 'America/Chicago');
678+
$newTime = $time->subYears(3);
679+
$this->assertEquals('2017-01-10 13:20:33', $time->toDateTimeString());
680+
$this->assertEquals('2014-01-10 13:20:33', $newTime->toDateTimeString());
681+
}
574682
}

0 commit comments

Comments
 (0)