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

Тема в разделе "PHP", создана пользователем CrashX, 19 май 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    раньше я использовал в место даты 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

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

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


    сам сижу думаю уже пол дня пока ничего не получается(((
     
  2. MadWizard

    MadWizard Постоялец

    Регистр.:
    24 мар 2009
    Сообщения:
    145
    Симпатии:
    20
    А чем для форматирования не подходят стандартные date или gmdate?

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

    TrojaNFlash Прохожие

    очень плохая нужда, именно из-за того что ее потом геморой форматить...
     
  4. localhost:80

    localhost:80 Постоялец

    Регистр.:
    4 дек 2008
    Сообщения:
    102
    Симпатии:
    15
    лучше не надо, постоянно мучаюсь со скриптами где дата выводиться в каком то своем формате отличном от unixtime или упущено указание времени с точностью до секунд, это от лукавого. timestamp самый удобный формат, его можно конвертировать при желании во что угодно, причем стандартными средствами php, в других языках уверен тоже
     
  5. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    если установлена локаль, то с локализацией например так:
    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.net/setlocale
    php.net/strtotime
    php.net/strftime
    Перейти по ссылке
    Перейти по ссылке
     
  6. Casper_R

    Casper_R Создатель

    Регистр.:
    3 май 2007
    Сообщения:
    87
    Симпатии:
    25
    я для конверта дат еще давно написал такую функцию. может, пригодится.
    PHP:
    function conv_date ($format,$date) {
    # Вызов функции:
    # conv_date('%d %b %Y г. %H:%M:%S', $DATE)

    $date strftime($formatstrtotime($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;
    }
     
  7. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    Каков костыль.
     
  8. liquinoid

    liquinoid Создатель

    Регистр.:
    23 апр 2009
    Сообщения:
    24
    Симпатии:
    0
    Можно попробовать Zend_Data от Zend Framework'а.. Оно умеет.
     
  9. Casper_R

    Casper_R Создатель

    Регистр.:
    3 май 2007
    Сообщения:
    87
    Симпатии:
    25
    вполне себе рабочий. для задания формата ('%d %b %Y г. %H:%M:%S') вывода легкий и удобный
     
  10. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    и так в тот же жеднь сделал сам с
    Код:
    // в БД созранять без погрешности на часовой пояс
    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
    мне
     
Статус темы:
Закрыта.