/**
  * Create a new Day.
  *
  * @param integer $dayOfWeek The day of week.
  * @param array $openingIntervals The opening intervals.
  * @return Day
  */
 public static function fromArray($dayOfWeek, array $openingIntervals)
 {
     $intervals = array();
     foreach ($openingIntervals as $interval) {
         if ($interval instanceof TimeIntervalInterface) {
             $intervals[] = $interval;
         } elseif (is_array($intervals)) {
             $intervals[] = new TimeInterval(TimeBuilder::fromString($interval[0]), TimeBuilder::fromString($interval[1]));
         }
     }
     $day = new Day($dayOfWeek, $intervals);
     $dayIntervals = $day->getOpeningHoursIntervals();
     /** @var TimeIntervalInterface $dayInterval */
     $dayInterval = reset($dayIntervals);
     if (self::isIntervalAllDay($dayInterval->getStart(), $dayInterval->getEnd())) {
         return new AllDay($dayOfWeek);
     }
     return $day;
 }
 /**
  * Create a new BusinessHours with a different timezone from an existing BusinessHours.
  *
  * @param BusinessHours $businessHours The original business hours.
  * @param \DateTimeZone $newTimezone The new timezone.
  * @return BusinessHours
  */
 public static function shiftToTimezone(BusinessHours $businessHours, \DateTimeZone $newTimezone)
 {
     $now = new \DateTime('now');
     $oldTimezone = $businessHours->getTimezone();
     $offset = $newTimezone->getOffset($now) - $oldTimezone->getOffset($now);
     if ($offset === 0) {
         return clone $businessHours;
     }
     $tmpDays = array_fill_keys(Day::getDaysOfWeek(), array());
     foreach ($businessHours->getDays() as $day) {
         foreach ($day->getOpeningHoursIntervals() as $interval) {
             $start = $interval->getStart()->toSeconds() + $offset;
             $end = $interval->getEnd()->toSeconds() + $offset;
             // Current day.
             if ($start < 86400 && $end > 0) {
                 $startForCurrentDay = max($start, 0);
                 $endForCurrentDay = min($end, 86400);
                 $dayOfWeek = $day->getDayOfWeek();
                 $interval = new TimeInterval(TimeBuilder::fromSeconds($startForCurrentDay), TimeBuilder::fromSeconds($endForCurrentDay));
                 array_push($tmpDays[$dayOfWeek], $interval);
             }
             // Previous day.
             if ($start < 0) {
                 $startForPreviousDay = 86400 + $start;
                 $endForPreviousDay = min(86400, 86400 + $end);
                 $dayOfWeek = self::getPreviousDayOfWeek($day->getDayOfWeek());
                 $interval = new TimeInterval(TimeBuilder::fromSeconds($startForPreviousDay), TimeBuilder::fromSeconds($endForPreviousDay));
                 array_push($tmpDays[$dayOfWeek], $interval);
             }
             // Next day.
             if ($end > 86400) {
                 $startForNextDay = max(0, $start - 86400);
                 $endForNextDay = $end - 86400;
                 $dayOfWeek = self::getNextDayOfWeek($day->getDayOfWeek());
                 $interval = new TimeInterval(TimeBuilder::fromSeconds($startForNextDay), TimeBuilder::fromSeconds($endForNextDay));
                 array_push($tmpDays[$dayOfWeek], $interval);
             }
         }
     }
     $tmpDays = array_filter($tmpDays);
     $days = self::flattenDaysIntervals($tmpDays);
     return new BusinessHours($days, $newTimezone);
 }
Beispiel #3
0
 /**
  * {@inheritdoc}
  */
 public function jsonSerialize()
 {
     $data = parent::jsonSerialize();
     $data['allDay'] = true;
     return $data;
 }