Конвертор даты

Статус
В этой теме нельзя размещать новые ответы.

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
682
Реакции
114
раньше я использовал в место даты time(); те большое значение int
(формат даты в секундах)
функция для форматирования даты была такой

Код:
define('DATEFORMAT',    'd F Y H:i'); // представление даты
define('OFFSET',    6); часовой пояс

/**
* Локализация даты
* @param mixed дата в секудах с 1970 года
* @param mixed формат даты если необходимо или нужно изменить
* @return mixed
*/
function dateformat($datetimestamp,$dateformat=DATEFORMAT)
{
$fullweekdays=array(_SUNDAY,_MONDAY,_TUESDAY,_WEDNESDAY,_THURSDAY,_FRIDAY,_SATURDAY);
$dateformat=preg_replace("/(?<!\\\\)l/",$fullweekdays[date("w",$datetimestamp)],$dateformat);
$fullmonths=array(_JANUARY,_FEBRUARY,_MARCH,_APRIL,_MAY,_JUNE,_JULY,_AUGUST,_SEPTEMBER,_OCTOBER,_NOVEMBER,_DECEMBER);
$dateformat=preg_replace("/(?<!\\\\)F/",$fullmonths[date("n",$datetimestamp)-1],$dateformat);
$shortweekdays=array(_SUN,_MON,_TUE,_WED,_THU,_FRI,_SAT);
$dateformat=preg_replace("/(?<!\\\\)D/",$shortweekdays[date("w",$datetimestamp)],$dateformat);
unset($fullweekdays,$shortweekdays,$fullmonths);
return date($dateformat,$datetimestamp+OFFSET*60*60);
}
сейчас появилась нужда перевода сервиса на даты в формате DateTime

как создать функцию для преведению в нужный вид и локализацю даты соовественно

заранее спасибо))))


сам сижу думаю уже пол дня пока ничего не получается(((
 
А чем для форматирования не подходят стандартные date или gmdate?

Как вариант для минимального изменения кода, можно при получении преобразовать datetime -> timestamp:
"Для получения метки времени из строкового представления даты можно использовать функцию strtotime(). Кроме того, некоторые базы данных имеют собственные функции для преобразования внутреннего представления даты в метку времени (например, функция MySQL UNIX_TIMESTAMP). "
 
сейчас появилась нужда перевода сервиса на даты в формате DateTime

лучше не надо, постоянно мучаюсь со скриптами где дата выводиться в каком то своем формате отличном от unixtime или упущено указание времени с точностью до секунд, это от лукавого. timestamp самый удобный формат, его можно конвертировать при желании во что угодно, причем стандартными средствами php, в других языках уверен тоже
 
если установлена локаль, то с локализацией например так:
PHP:
//timestamp->datetime
setlocale(LC_TIME, 'ru_RU.UTF8');
echo strftime('%A, %d %B %Y %Z %x', 1242733660);//Вторник, 19 Май 2009 EEST 19.05.2009
echo '<br>';
//datetime->timestamp
setlocale(LC_TIME, "en_US");//для функции strtotime если конвертируется текстовая дата, то должна быть на английском GNU формата
echo strtotime(strftime('%A, %d %B %Y', 1242733660));
echo '<br>';
echo strtotime("2009-5-30 15:01:31");
или из mysql (19 Мая, Вторник:(
Код:
SET lc_time_names = 'ru_RU';
SELECT DATE_FORMAT(NOW(),'%e %M, %W');
SELECT DATE_FORMAT(FROM_UNIXTIME(1242733660),'%e %M, %W');
SELECT DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(DATE_FORMAT(NOW(),'%e %M, %W'))),'%e %M, %W');
 
я для конверта дат еще давно написал такую функцию. может, пригодится.
PHP:
function conv_date ($format,$date) {
# Вызов функции:
# conv_date('%d %b %Y г. %H:%M:%S', $DATE)

$date = strftime($format, strtotime($date));

$from = array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December','Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
$to   = array('Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс', 'января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря','янв','фев','мар','апр','мая','июн','июл','авг','сен','окт','ноя','дек');

$date = str_replace($from,$to,$date);
return $date;
}
 
я для конверта дат еще давно написал такую функцию. может, пригодится.
PHP:
function conv_date ($format,$date) {
# Вызов функции:
# conv_date('%d %b %Y г. %H:%M:%S', $DATE)

$date = strftime($format, strtotime($date));

$from = array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December','Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
$to   = array('Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс', 'января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря','янв','фев','мар','апр','мая','июн','июл','авг','сен','окт','ноя','дек');

$date = str_replace($from,$to,$date);
return $date;
}

Каков костыль.
 
Можно попробовать Zend_Data от Zend Framework'а.. Оно умеет.
 
и так в тот же жеднь сделал сам с
Код:
// в БД созранять без погрешности на часовой пояс
function dateiso($datetimestamp,$dateformat=DATEFORMAT)
{
$this->TimeStamp($datetimestamp);
return date($dateformat,$datetimestamp);
}
// для формата data YYYY-MM-DD
function date(&$date,$separator='-',$index=array('Y','M','D'))
{
$date=trim($date);
$value=explode($separator,$date);
$value[0]=intval($value[0]);
$value[1]=intval($value[1]);
$value[2]=intval($value[2]);
$date=array_combine($index,$value);
return $date;
}
// для тайм HH:MM:SS
function time(&$time,$separator=':')
{
$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)
{
list($date,$time)=explode(" ",$datetime);
$this->date($date,'-',array('Y','M','D'));
$this->time($time,':');
$datetime=array_merge($date,$time);
return $datetime;
}
// Unix-Stamp
function timestamp(&$date)
{
$this->parsedate($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)
{
//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('D','M','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))
//20/05/09 if(preg_match('/\d{2}\/\d{2}\/\d{2}/',$value))
//20.05.09 if(preg_match('/\d{2}\.\d{2}\.\d{2}/',$value))
//20 05 09 if(preg_match('/\d{2}\s{1}\d{2}\s{1}\d{2}/',$value))
return value;
}



тут вступает ограничение, дата должна быть 1970> ТУТ < 2038
не смейтесь мне, но мне мало и я хочу датой управлять с помошью тех же переменный что и PHP те меняю формат гдето с d.m.y на j F y и все например это нужно в платежных поручениях...


зло...
в SQL не целесобразно, тк СуБД вскоре будем менять, или на МС или Постгри

подскажите как или где можно вот этот формат ДАТА YYYY-MM-DD или ДатаТайм YYYY-MM-DD HH-MM-SS
мне
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху