--- date_api.views.beta3.inc	2008-06-15 22:12:04.000000000 +0200
+++ date_api.views.inc	2008-06-16 00:53:44.000000000 +0200
@@ -496,7 +496,7 @@
     parent::construct();
     include_once('./'. drupal_get_path('module', 'date_api') .'/date_api_sql.inc');
     $this->date_handler = new date_sql_handler();
-    $this->date_handler->construct();
+    $this->date_handler->construct(DATE_ISO);
     $this->date_handler->granularity = $this->options['granularity'];
     if (isset($this->definition['content_field'])) {
       $this->date_handler->date_type = $this->definition['content_field']['type'];
@@ -705,11 +708,37 @@
     $values = $form_state['values']['options']['value'];
     // Validate date values.
     unset($values['offset']);
-    foreach ($values as $name => $value) {
-      $part = str_replace(array('min', 'max', 'value'), '', $value);
-      if (!empty($part) && $value != '' && $value != 'now' &&
-        ($value < $min[$part] || $value > $max[$part])) {
-        form_error($form['value'][$name], t('@value is invalid.', array('@value' => $parts[$part])));
+    $date_parts_required = $handler->date_parts($this->options['granularity']);
+    foreach ($values as $full_name => $value) { //Validate a date. FIXME: This code does not work for adjustment values (e.g. "+1 day") so they still won't work
+      if ($value == '' || $value == 'now')
+        continue;
+      if (substr($full_name, 0, 3) == 'min' || substr($full_name, 0, 3) == 'max')
+        continue; //the min and max should probably not be validated (in my case they are not even set)
+      if (substr($full_name, 0, 5) == 'value') //will be 'valuedate' (supported) or 'valueadjustment' (FIXME not supported, validation will fail!)
+        $name = substr($full_name, 5);
+      else //can this happen, that there is no 'value'-prefix on the name?
+        $name = $full_name;
+      $value_parts = $handler->arg_parts($value);
+      if (!isset($value_parts[0]['date'])) {
+        //no date found in $value string
+        form_error($form['value'][$full_name], t('@value is invalid.', array('@value' => $parts[$name])));
+      } else {
+        $value_parts = $value_parts[0]['date'];
+        foreach ($date_parts_required as $date_part => $part_title) { //$date_part becomes 'year','month', ... up to granularity
+          if (!isset($value_parts[$date_part])
+              || $value_parts[$date_part] < $min[$date_part]
+              || $value_parts[$date_part] > $max[$date_part]) {
+            form_error($form['value'][$full_name], t('@value has invalid @part.', array('@value' => $parts[$name], '@part' => drupal_strtolower($part_title)))); 
+          }
+          unset($value_parts[$date_part]);//remove then parts used
+        }
+        if (count($value_parts) > 0) { //has given date with too fine granularity (e.g. hour when only day was expected)
+          form_error($form['value'][$full_name],
+            t('@value is invalid.', array('@value' => $parts[$name])) .' '.
+            t('No @part should be given when granularity is set to @granularity.',
+                array('@part' => t(array_shift(array_keys($value_parts))),
+                      '@granularity' => t($this->options['granularity']))));
+        }
       }
     }
   }
