Browse Source

Fixed date marshalling, the previous implementation coudl lead to bad
dates when a date is selected aroudn daylight saving timzone changes

Jose Lorenzo Rodriguez 12 years ago
parent
commit
6a4a9d2020
1 changed files with 9 additions and 10 deletions
  1. 9 10
      src/Database/Type/DateTimeType.php

+ 9 - 10
src/Database/Type/DateTimeType.php

@@ -101,23 +101,22 @@ class DateTimeType extends \Cake\Database\Type {
 			return $value;
 		}
 
-		$value += ['second' => 0];
+		$value += ['hour' => 0, 'minute' => 0, 'second' => 0];
 
-		$date = new $class();
-		$date->setTime(0, 0, 0);
+		$format = '';
 		if (
 			isset($value['year'], $value['month'], $value['day']) &&
 			(is_numeric($value['year']) & is_numeric($value['month']) && is_numeric($value['day']))
 		) {
-			$date->setDate($value['year'], $value['month'], $value['day']);
+			$format .= sprintf('%d-%02d-%02d', $value['year'], $value['month'], $value['day']);
 		}
-		if (isset($value['hour'], $value['minute'])) {
-			if (isset($value['meridian'])) {
-				$value['hour'] = strtolower($value['meridian']) === 'am' ? $value['hour'] : $value['hour'] + 12;
-			}
-			$date->setTime((int)$value['hour'], (int)$value['minute'], (int)$value['second']);
+
+		if (isset($value['meridian'])) {
+			$value['hour'] = strtolower($value['meridian']) === 'am' ? $value['hour'] : $value['hour'] + 12;
 		}
-		return $date;
+		$format .= sprintf('%02d:%02d:%02d', $value['hour'], $value['minute'], $value['second']);
+
+		return new $class($format);
 	}
 
 }