Tienes varias opciones. La más simple es usar el helper Form para crear en tu formulario un campo especial para fechas. Mírate el método "dateTime" en la documentación: api.cakephp.org/class/form-helper
De esta forma no tendrás que hacer nada, porque automáticamente te guarda bien la fecha. A mi no me gusta mucho porque todo lo hace con "selects" y es un tanto incómodo para los usuarios. Me gusta añadir un calendario con javascript.
La opción que yo uso es con un campo de texto normal. Luego en el modelo sobreescribo el método "beforeSave" modificando el formato de la fecha. Este método se llama antes de guardar los datos, así que ahí puedes meter las modificaciones que necesites.
Te pongo un ejemplo para que lo veas mejor. Supón que se trata de un blog y el modelo que queremos modificar se llama "post".
Este sería el codigo del modelo. En el método beforeSave se llama a una función que formatea la fecha.
Código PHP:
<?php
class Post extends AppModel{
public $name = 'Post';
public function beforeSave($options = array()){
$this->data['Post']['publish'] = formatDate($this->data['Post']['publish']);
if(empty($this->data['Post']['publish'])){
$this->data['Post']['publish'] = date('Y-m-d H:i');
}
return parent::beforeSave($options);
}
}
?>
Este es el código de la función que formatea la fecha. Recibe una fecha en formato 'yyyy-mm-dd', 'yyyy/mm/dd', 'dd-mm-yyyy' o 'dd/mm/yyyy' y la devuelve en el formato 'yyyy-mm-dd'. Si no está en uno de los anteriores formatos devuelve null.
Código PHP:
function formatDate($dateToFormat){
$pattern1 = '/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/i';
$pattern2 = '/^([0-9]{4})\/([0-9]{2})\/([0-9]{2})$/i';
$pattern3 = '/^([0-9]{2})-([0-9]{2})-([0-9]{4})$/i';
$pattern4 = '/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/i';
$coincidences = array();
if(preg_match($pattern1, $dateToFormat)){
$newDate = $dateToFormat;
}elseif(preg_match($pattern2, $dateToFormat, $coincidences)){
$newDate = $coincidences[1] . '-' . $coincidences[2] . '-' . $coincidences[3];
}elseif(preg_match($pattern3, $dateToFormat, $coincidences)){
$newDate = $coincidences[3] . '-' . $coincidences[2] . '-' . $coincidences[1];
}elseif(preg_match($pattern4, $dateToFormat, $coincidences)){
$newDate = $coincidences[3] . '-' . $coincidences[2] . '-' . $coincidences[1];
}else{
$newDate = null;
}
return $newDate;
}
Lo bueno de hacer esto sobreescribiendo el método beforeSave es que no te tienes que preocupar cada vez que vayas a modificar una fecha de Post. Con lo que lo escribimos una vez y lo usamos siempre, sin ni siquiera tener que llamarlo.
Espero que te haya servido.