public function testTimestampsAtMidnight()
 {
     $u = new PhabricatorUser();
     $u->setTimezoneIdentifier('America/Los_Angeles');
     $days = $this->getAllDays();
     foreach ($days as $day) {
         $data = CalendarTimeUtil::getCalendarWidgetTimestamps($u, $day);
         $this->assertEqual('000000', $data['epoch_stamps'][0]->format('His'));
     }
 }
 private function renderCalendarWidgetPaneContent()
 {
     $user = $this->getRequest()->getUser();
     $conpherence = $this->getConpherence();
     $participants = $conpherence->getParticipants();
     $widget_data = $conpherence->getWidgetData();
     // TODO: This panel is built around an outdated notion of events and isn't
     // invitee-aware.
     $statuses = $widget_data['events'];
     $handles = $conpherence->getHandles();
     $content = array();
     $layout = id(new AphrontMultiColumnView())->setFluidLayout(true);
     $timestamps = CalendarTimeUtil::getCalendarWidgetTimestamps($user);
     $today = $timestamps['today'];
     $epoch_stamps = $timestamps['epoch_stamps'];
     $one_day = 24 * 60 * 60;
     $is_today = false;
     $calendar_columns = 0;
     $list_days = 0;
     foreach ($epoch_stamps as $day) {
         // build a header for the new day
         if ($day->format('Ymd') == $today->format('Ymd')) {
             $active_class = 'today';
             $is_today = true;
         } else {
             $active_class = '';
             $is_today = false;
         }
         $should_draw_list = $list_days < 7;
         $list_days++;
         if ($should_draw_list) {
             $content[] = phutil_tag('div', array('class' => 'day-header ' . $active_class), array(phutil_tag('div', array('class' => 'day-name'), $day->format('l')), phutil_tag('div', array('class' => 'day-date'), $day->format('m/d/y'))));
         }
         $week_day_number = $day->format('w');
         $epoch_start = $day->format('U');
         $next_day = clone $day;
         $next_day->modify('+1 day');
         $epoch_end = $next_day->format('U');
         $first_status_of_the_day = true;
         $statuses_of_the_day = array();
         // keep looking through statuses where we last left off
         foreach ($statuses as $status) {
             if ($status->getDateFrom() >= $epoch_end) {
                 // This list is sorted, so we can stop looking.
                 break;
             }
             if ($status->getDateFrom() < $epoch_end && $status->getDateTo() > $epoch_start) {
                 $statuses_of_the_day[$status->getUserPHID()] = $status;
                 if ($should_draw_list) {
                     $top_border = '';
                     if (!$first_status_of_the_day) {
                         $top_border = ' top-border';
                     }
                     $timespan = $status->getDateTo() - $status->getDateFrom();
                     if ($timespan > $one_day) {
                         $time_str = 'm/d';
                     } else {
                         $time_str = 'h:i A';
                     }
                     $epoch_range = phabricator_format_local_time($status->getDateFrom(), $user, $time_str) . ' - ' . phabricator_format_local_time($status->getDateTo(), $user, $time_str);
                     if (isset($handles[$status->getUserPHID()])) {
                         $secondary_info = pht('%s, %s', $handles[$status->getUserPHID()]->getName(), $epoch_range);
                     } else {
                         $secondary_info = $epoch_range;
                     }
                     $content[] = phutil_tag('div', array('class' => 'user-status ' . $top_border), array(phutil_tag('div', array('class' => 'icon'), ''), phutil_tag('div', array('class' => 'description'), array($status->getName(), phutil_tag('div', array('class' => 'participant'), $secondary_info)))));
                 }
                 $first_status_of_the_day = false;
             }
         }
         // we didn't get a status on this day so add a spacer
         if ($first_status_of_the_day && $should_draw_list) {
             $content[] = phutil_tag('div', array('class' => 'no-events pm'), pht('No Events Scheduled.'));
         }
         if ($is_today || $calendar_columns && $calendar_columns < 3) {
             $active_class = '';
             if ($is_today) {
                 $active_class = '-active';
             }
             $inner_layout = array();
             foreach ($participants as $phid => $participant) {
                 $status = idx($statuses_of_the_day, $phid, false);
                 if ($status) {
                     $inner_layout[] = phutil_tag('div', array(), '');
                 } else {
                     $inner_layout[] = phutil_tag('div', array('class' => 'present'), '');
                 }
             }
             $layout->addColumn(phutil_tag('div', array('class' => 'day-column' . $active_class), array(phutil_tag('div', array('class' => 'day-name'), $day->format('D')), phutil_tag('div', array('class' => 'day-number'), $day->format('j')), $inner_layout)));
             $calendar_columns++;
         }
     }
     return array($layout, $content);
 }