DEFINE('_MONDAY', 'Понедельник');
DEFINE('_TUESDAY', 'Вторник');
DEFINE('_WEDNESDAY', 'Среда');
DEFINE('_THURSDAY', 'Четверг');
DEFINE('_FRIDAY', 'Пятница');
DEFINE('_SATURDAY', 'Суббота');
DEFINE('_SUNDAY', 'Воскресенье');
DEFINE('_MON', 'пн');
DEFINE('_TUE', 'вт');
DEFINE('_WED', 'ср');
DEFINE('_THU', 'чт');
DEFINE('_FRI', 'пт');
DEFINE('_SAT', 'сб');
DEFINE('_SUN', 'вс');
DEFINE('_JANUARY', 'января');
DEFINE('_FEBRUARY', 'февраля');
DEFINE('_MARCH', 'марта');
DEFINE('_APRIL', 'апреля');
DEFINE('_MAY', 'мая');
DEFINE('_JUNE', 'июня');
DEFINE('_JULY', 'июля');
DEFINE('_AUGUST', 'августа');
DEFINE('_SEPTEMBER', 'сентября');
DEFINE('_OCTOBER', 'октября');
DEFINE('_NOVEMBER', 'ноября');
DEFINE('_DECEMBER', 'декабря');
/**
* Локализация даты
* @param mixed дата (в любом из понимаемых видов которые парсятся в ParseDate)
* @param mixed формат даты если необходимо или нужно изменить
* @return mixed
*/
function dateformat($date, $dateformat=DATEFORMAT, $offset=OFFSET) {
$this->parsedate($date, $offset);
$result = null;
$symbol = null;
$match = null;
$fullmonths = array(_JANUARY, _FEBRUARY, _MARCH, _APRIL, _MAY, _JUNE, _JULY, _AUGUST, _SEPTEMBER, _OCTOBER, _NOVEMBER, _DECEMBER);
$shortmonths = array();
//$shortmonths=array(_JAN,_FEB,_MAR,_APR,_MAY,_JUN,_JUL,_AUG,_SEP,_OCT,_NOV,_DEC);
$fullweekdays = array(_SUNDAY, _MONDAY, _TUESDAY, _WEDNESDAY, _THURSDAY, _FRIDAY, _SATURDAY);
$shortweekdays = array(_SUN, _MON, _TUE, _WED, _THU, _FRI, _SAT);
for ($i = 0; $i < strlen($dateformat); $i++):
$symbol = substr($dateformat, $i, 1);
$match = null;
switch ($symbol):
case "d": //d День месяца, 2 цифры с ведущими нулями от 01 до 31
$match = str_pad($date["D"], 2, "0", STR_PAD_LEFT);
break;
case "j": //j День месяца без ведущих нулей От 1 до 31
$match = intVal($date["D"]);
break;
case "m": //m Порядковый номер месяца с ведущими нулями От 01 до 12
$match = str_pad($date["M"], 2, "0", STR_PAD_LEFT);
break;
case "n": //n Порядковый номер месяца без ведущих нулей От 1 до 12
$match = intVal($date["M"]);
break;
case "F": //F Полное наименование месяца, например January или March от January до December
$match = str_pad($date["M"], 2, "0", STR_PAD_LEFT);
if (intVal($date["M"]) > 0):
$match = $fullmonths[intVal($date["M"]) - 1];
endif;
break;
case "M": //M Сокращенное наименование месяца, 3 символа От Jan до Dec
$match = str_pad($date["M"], 2, "0", STR_PAD_LEFT);
if (intVal($date["M"]) > 0):
$match = $shortmonths[intVal($date["M"]) - 1];
endif;
break;
case "Y": //Y Порядковый номер года, 4 цифры Примеры: 1999, 2003
$match = str_pad($date["Y"], 4, "0", STR_PAD_LEFT);
break;
case "y": //y Номер года, 2 цифры Примеры: 99, 03
$match = substr($date["Y"], 2);
break;
case "H": //H Часы в 24-часовом формате с ведущими нулями От 00 до 23
$match = str_pad($date["H"], 2, "0", STR_PAD_LEFT);
break;
case "h": //h Часы в 12-часовом формате с ведущими нулями От 01 до 12
$match = str_pad($date["H"], 2, "0", STR_PAD_LEFT);
if ($match > 12)
$match = $match - 12;
break;
case "G": //G Часы в 24-часовом формате без ведущих нулей От 0 до 23
$match = intVal($date["H"]);
break;
case "g": //g Часы в 12-часовом формате без ведущих нулей От 1 до 12
$match = intVal($date["H"]);
if ($match > 12):
$match = $match - 12;
endif;
break;
case "i": //i Минуты с ведущими нулями 00 to 59
$match = str_pad($date["I"], 2, "0", STR_PAD_LEFT);
break;
case "s": //s Секунды с ведущими нулями От 00 до 59
$match = str_pad($date["S"], 2, "0", STR_PAD_LEFT);
break;
case "w": //w Порядковый номер дня недели От 0 (Sunday) до 6 (Saturday)
$match = date("w", $this->timestamp($date));
break;
case "l": //l (строчная 'L') Полное наименование дня недели От Sunday до Saturday
$match = date("w", $this->timestamp($date));
if (intVal($match) >= 0):
$match = $fullweekdays[intVal($match)];
endif;
break;
case "D": //D Сокращенное наименование дня недели, 3 символа от Mon до Sun
$match = date("w", $this->timestamp($date));
if (intVal($match) >= 0):
$match = $shortweekdays[intVal($match)];
endif;
break;
case "a": //a Ante meridiem или Post meridiem в нижнем регистре am или pm
case "A": //A Ante meridiem или Post meridiem в верхнем регистре AM или PM
$match = intVal($date["H"]);
if ($match > 12):
$match = ($match - 12) . " PM";
else: $match .= " AM";
if (substr($dateformat, $i, 1) == "a"):
$match = strToLower($match);
endif;
endif;
break;
case "U": //U Количество секунд, прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970, 00:00:00 GMT)
$match = $this->timestamp($date);
break;
default: $match = substr($dateformat, $i, 1);
break;
endswitch;
$result.=$match;
endfor;
unset($i);
unset($match);
unset($symbol);
unset($fullmonths);
unset($shortmonths);
unset($fullweekdays);
unset($shortweekdays);
$date = $result;
unset($result);
return $date;
}
function date(&$date, $separator='-', $index=array('Y', 'M', 'D')) {
$date = trim($date);
$values = explode($separator, $date);
$values[0] = intval($values[0]);
$values[1] = intval($values[1]);
$values[2] = intval($values[2]);
$date = null;
$date = array();
if (PHP <= $this->compatibility):
foreach ($values as $key => $value):
$date[$index[$key]] = $values[$key];
endforeach;
else:
$date = array_combine($index, $values);
endif;
return $date;
}
function time(&$time, $separator=':') {
$hour = null;
$min = null;
$sec = null;
$time = trim($time);
list($hour, $min, $sec) = explode($separator, $time);
$hour = intval($hour);
$min = intval($min);
$sec = intval($sec);
$time = array('H' => $hour, 'I' => $min, 'S' => $sec);
return $time;
}
function datetime(&$datetime) {
$date = null;
$time = null;
list($date, $time) = explode(" ", $datetime);
$this->date($date, '-', array('Y', 'M', 'D'));
$this->time($time, ':');
$datetime = array_merge($date, $time);
return $datetime;
}
function timestamp(&$date) {
if (!checkdate($date['M'], $date['D'], $date['Y'])):
return false;
endif;
if ($date['H'] > 24 || $date['H'] < 0 || $date['I'] < 0 || $date['I'] > 59 || $date['S'] < 0 || $date['S'] > 59):
return false;
endif;
$date = mktime($date['H'], $date['I'], $date['S'], $date['M'], $date['D'], $date['Y']);
if ($date <= 0):
return false;
endif;
return $date;
}
function parsedate(&$value, $offset=OFFSET) {
//2009-05-20 13:10:55
if (@preg_match('/\d{4}\-\d{2}\-\d{2}\s{1}\d{2}\:\d{2}\:\d{2}/', $value)):
$this->datetime($value);
endif;
//2009-05-20
if (@preg_match('/\d{4}\-\d{2}\-\d{2}/', $value)):
$this->date($value, '-', array('Y', 'M', 'D'));
endif;
//20/05/2009
if (@preg_match('/\d{2}\/\d{2}\/\d{4}/', $value)):
$this->date($value, '/', array('M', 'D', 'Y'));
endif;
//20.05.2009
if (@preg_match('/\d{2}\.\d{2}\.\d{4}/', $value)):
$this->date($value, '.', array('D', 'M', 'Y'));
endif;
//20 05 2009
if (@preg_match('/\d{2}\s{1}\d{2}\s{1}\d{4}/', $value)):
$this->date($value, ' ', array('D', 'M', 'Y'));
endif;
//14:55:32
if (@preg_match('/\d{2}\:\d{2}\:\d{2}/', $value)):
$this->time($value, ':');
endif;
//09-05-20
if (@preg_match('/\d{2}\-\d{2}\-\d{2}/', $value)):
$this->date($value, '/', array('Y', 'M', 'D'));
endif;
//20/05/09
if (@preg_match('/\d{2}\/\d{2}\/\d{2}/', $value)):
$this->date($value, '/', array('M', 'D', 'Y'));
endif;
//20.05.09
if (@preg_match('/\d{2}\.\d{2}\.\d{2}/', $value)):
$this->date($value, '.', array('D', 'M', 'Y'));
endif;
//20 05 09
if (@preg_match('/\d{2}\s{1}\d{2}\s{1}\d{2}/', $value)):
$this->date($value, ' ', array('D', 'M', 'Y'));
endif;
if ($value['Y'] >= 40 && $value['Y'] <= 99):
$value['Y'] = str_pad($value['Y'], 4, "19", STR_PAD_LEFT);
endif;
if ($value['Y'] < 40 && $value['Y'] >= 0):
if (strlen($value['Y']) === 1):
$value['Y'] = str_pad($value['Y'], 4, "200", STR_PAD_LEFT);
elseif (strlen($value['Y']) === 2):
$value['Y'] = str_pad($value['Y'], 4, "20", STR_PAD_LEFT);
endif;
endif;
if (isset($offset) && $offset != 0):
// mktime ( $hour $min $sec $mon $day $year)
$value = $this->parsedate(date('Y-m-d H:i:s', mktime($value['H'] + date('I') + $offset, $value['I'], $value['S'], $value['M'], $value['D'], $value['Y'])), 0);
endif;
if (!checkdate($value['M'], $value['D'], $value['Y'])):
return null;
endif;
return $value;
}
//Пример
$value1='20.05.2009'; // RUS Format
$value2='05/20/2009'; // ENG Format
$value3='2009-05-20 13:10:55'; // MySQL DateTime
$value4='2009-05-20'; // MySQL Date
$value4='13:10:55'; // MySQL Time
echo dateformat($value1,'j F Y');
echo dateformat($value1,'d m Y H:i:s');
echo dateformat($value1,'d.m.Y');
echo dateformat($value1,'d F');
echo dateformat($value2,'j F Y');
echo dateformat($value2,'d m Y H:i:s');
echo dateformat($value2,'d.m.Y');
echo dateformat($value2,'d F');
echo dateformat($value3,'j F Y');
echo dateformat($value3,'d m Y H:i:s');
echo dateformat($value3,'d.m.Y');
echo dateformat($value3,'d F');
echo dateformat($value4,'j F Y');
echo dateformat($value4,'d m Y H:i:s');
echo dateformat($value4,'d.m.Y');
echo dateformat($value4,'d F');
echo dateformat($value5,'H i');
echo dateformat($value5,'H i s');
echo dateformat($value5,'a i');
echo dateformat($value5,'A i s');