diff --git a/commerce_reports.dashboard.inc b/commerce_reports.dashboard.inc
index 6031c94..37a00ae 100644
--- a/commerce_reports.dashboard.inc
+++ b/commerce_reports.dashboard.inc
@@ -92,7 +92,7 @@ function commerce_reports_dashboard_block($name, $options = array()) {
     $block = block_load($information['module'], $information['block']);
     $block_render = module_invoke($block->module, 'block_view', $block->delta);
 
-    $render['sections'][$name] = $block_render;
+    $render['sections'][$name] = ($block->module == 'views') ? $block_render['content'] : $block_render;
     $render['sections'][$name]['#width'] = empty($options['switchSections']) ? 100 : NULL;
 
     if (!empty($options['switchSections'])) {
diff --git a/includes/views/commerce_reports_handler_field_date.inc b/includes/views/commerce_reports_handler_field_date.inc
index 286d3e7..93e2442 100644
--- a/includes/views/commerce_reports_handler_field_date.inc
+++ b/includes/views/commerce_reports_handler_field_date.inc
@@ -23,16 +23,21 @@ class commerce_reports_handler_field_date extends views_handler_field {
     'Y-m-d' => array(
       'label' => 'Daily',
       'interval' => 86400,
+      'normalizationFunction' => '_normalizeDaily',
     ),
   );
 
+  protected function _normalizeDaily($timestamp) {
+    return strtotime('midnight', $timestamp);
+  }
+
   protected function _normalizeWeekly($timestamp) {
-    return strtotime('this week UTC', $timestamp);
+    return strtotime('last Sun this week', $timestamp);
   }
 
   protected function _normalizeMonthly($timestamp) {
     // Workaround for PHP 5.2; PHP 5.3 works with 'first day of this month'
-    return strtotime(date('Y-m', strtotime('this month UTC', $timestamp)) . ' UTC');
+    return strtotime(date('M-01-Y', $timestamp));
   }
 
   function option_definition() {
@@ -223,12 +228,33 @@ class commerce_reports_handler_field_date extends views_handler_field {
     $field_name = views_date_sql_format($this->getFormat(), $this->table_alias . '.' . $this->real_field);
     $this->query->add_groupby($field_name);
 
-    $end_date = $this->endDate + $this->getInterval();
+    $end_date = $this->getQueryEndDate($this->endDate);
     $this->query->add_where_expression(0, "{$this->table_alias}.{$this->real_field} BETWEEN {$this->startDate} AND {$end_date}");
 
     $this->add_additional_fields();
   }
 
+  /**
+   * @param $timestamp
+   *  The normalized end date as a Unix timestamp.
+   *
+   * @return int
+   *  The appropriate end date for a query, based on the input granularity.
+   */
+  function getQueryEndDate($timestamp) {
+    switch ($this->getFormat()) {
+      case 'Y-m':
+        // It's monthly
+        return strtotime(date('M-t-Y', $timestamp) . '+1 day');
+      case 'o-W':
+        // It's weekly
+        return strtotime(date('M-d-Y', $timestamp) . '+1 week');
+      case 'Y-m-d':
+        // It's daily
+        return strtotime(date('M-d-Y', $timestamp) . '+1 day');
+    }
+  }
+
   function render($values) {
     $timestamp = $this->get_value($values);
 
@@ -237,7 +263,7 @@ class commerce_reports_handler_field_date extends views_handler_field {
       $format = $this->granularities[$format]['displayFormat'];
     }
 
-    $value = format_date($timestamp, 'custom', $format, 'UTC');
+    $value = format_date($timestamp, 'custom', $format);
 
     return $this->sanitize_value($value);
   }
@@ -268,11 +294,8 @@ class commerce_reports_handler_field_date extends views_handler_field {
       return;
     }
 
-    $interval = $this->getInterval();
     $defaults = array();
-
-    for ($current = $this->startDate; $current <= $this->endDate; $current += $interval) {
-      $timestamp = $this->convertTimestamp($current);
+    for ($timestamp = $this->startDate; $timestamp < $this->endDate; $timestamp = $this->getQueryEndDate($timestamp)) {
       $defaults[$timestamp] = (object) array($this->field_alias => $timestamp);
     }
 
