| public function clean($value)␊ | 
| {␊ | 
| parent::clean($value);␊ | 
| $out = null;␊ | 
| if (in_array($value, $this->empty_values)) {␊ | 
| return '';␊ | 
| }␊ | 
| foreach ($this->input_formats as $format) {␊ | 
| if (false !== ($date = strptime($value, $format))) {␊ | 
| $day = str_pad($date['tm_mday'], 2, '0', STR_PAD_LEFT);␊ | 
| $month = str_pad($date['tm_mon']+1, 2, '0', STR_PAD_LEFT);␊ | 
| $year = str_pad($date['tm_year']+1900, 4, '0', STR_PAD_LEFT);␊ | 
| $h = str_pad($date['tm_hour'], 2, '0', STR_PAD_LEFT);␊ | 
| $m = str_pad($date['tm_min'], 2, '0', STR_PAD_LEFT);␊ | 
| $s = $date['tm_sec'];␊ | 
| if ($s > 59) $s=59;␊ | 
| $s = str_pad($s, 2, '0', STR_PAD_LEFT);␊ | 
| $out = $year.'-'.$month.'-'.$day.' '.$h.':'.$m.':'.$s;␊ | 
| break;␊ | 
| $day   = $date['tm_mday'];␊ | 
| $month = $date['tm_mon'] + 1;␊ | 
| $year  = $date['tm_year'] + 1900;␊ | 
| // PHP's strptime has various quirks, e.g. it doesn't check␊ | 
| // gregorian dates for validity and it also allows '60' in␊ | 
| // the seconds part␊ | 
| if (checkdate($month, $day, $year) && $date['tm_sec'] < 60) {␊ | 
| $date = str_pad($year,  4, '0', STR_PAD_LEFT).'-'.␊ | 
| str_pad($month, 2, '0', STR_PAD_LEFT).'-'.␊ | 
| str_pad($day,   2, '0', STR_PAD_LEFT).' '.␊ | 
| str_pad($date['tm_hour'], 2, '0', STR_PAD_LEFT).':'.␊ | 
| str_pad($date['tm_min'],  2, '0', STR_PAD_LEFT).':';␊ | 
| str_pad($date['tm_sec'],  2, '0', STD_PAD_LEFT);␊ | 
| ␊ | 
| // we internally use GMT, so we convert it to a GMT date.␊ | 
| return gmdate('Y-m-d H:i:s', strtotime($date));␊ | 
| }␊ | 
| }␊ | 
| }␊ | 
| if ($out !== null) {␊ | 
| // We internally use GMT, so we convert it to a GMT date.␊ | 
| return gmdate('Y-m-d H:i:s', strtotime($out));␊ | 
| }␊ | 
| throw new Pluf_Form_Invalid(__('Enter a valid date/time.'));␊ | 
| }␊ | 
| }␊ |