17 июля 2009 -> 2009-07-17

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

belbek

Новичок
17 июля 2009 -> 2009-07-17

Есть в пхп функции обеспечивающие указанную в теме конвертацию?
 

tf

крылья рулят
млин а я такое писал целый день
применяется только для подобных переименований, хотя черти что может отпрасить...
 

nexen

Новичок

DiMA

php.spb.ru
Команда форума
nexen
Не тупи, вопрос - как распознать рукописную дату.
 

nexen

Новичок
аааа - ё маё, а разделители какие в строке "-" ? конечно - лучше бы подробней описали что и для чего вы хотите сделать . . .
 

Фанат

oncle terrible
Команда форума
nexen
кроме тебя все поняли задачу.
если ты не понял - постой молча. не будь к каждой бочке затычкой
 

nexen

Новичок
$str = '17 feb 2009';

function convert($str){
$mon = array(0 => 'jan', 1 => 'feb', 2 => 'mar', 3 => 'apr', 4 => 'may', 5 => 'jun', 6 => 'jul', 7 => 'aug', 8 => 'sep', 9 => 'oct', 10 => 'nov', 11 => 'dec');
$num = array(0 => '01', 1 => '02', 2 => '03', 3 => '04', 4 => '05', 5 => '06', 6 => '07', 7 => '08', 8 => '09', 9 => '10', 10 => '11', 11 => '12');
$str = explode(' ', $str);
for($i = 0; $i < 12; ++$i){
if($mon[$i] === $str[1]){
$date = $str[0].':'.$num[$i].':'.$str[2];
}
}
return $date;
}
$res = convert($str);
echo $res;

p.s.
да я тоже вроде понял - примерно вот так это будет при условии что названия месяцов - константы
 

DiMA

php.spb.ru
Команда форума
ты зачем здесь позоришься со своим говнокодом?

1. 3 части нужно выделять регом
2. цикл не нужен, есть in_array() + isset
3. константы с датами не нужны (еще бы константы на года завел, если быть логичным в тупости до конца)
4. функция должна вернуть unixtime, чтобы вызывающий код сам решил, как форматировать
5. про отстуствие проверок на ошибки - молчим
6. про отстуствие BREAK внутри IF (а лучше сразу RETURN) - тоже

ПС. Вот первая версия говнокода из сообщения выше:
PHP:
<?php 
$str = '17 feb 2009'; 

function convert($str){ 
     $mon = array(0 => 'jan', 1 => 'feb', 2 => 'mar', 3 => 'apr', 4 => 'may', 5 => 'jun', 6 => 'jul', 7 => 'aug', 8 => 'sep', 9 => 'oct', 10 => 'nov', 11 => 'dec'); 
     $num = array(0 => '01', 1 => '02', 2 => '03', 3 => '04', 4 => '05', 5 => '06', 6 => '07', 7 => '08', 8 => '09', 9 => '10', 10 => '11', 11 => '12'); 
     $str = explode(' ', $str); 
     for($i = 0; $i < 12; ++$i){ 
          if($mon[$i] === $str[1]){ 
               $date = $str[0].':'.$num[$i].':'.$str[2]; 
          } 
     } 
     return $date; 
} 
$res = convert($str); 
echo $res; 
?>
Вторая версия говнокода из сообщения выше уже такая:

PHP:
if($mon[$i] === $str[1]){
$date = $str[0].':'.$num[$i].':'.$str[2];
}
else{
die('convert failed . . .');
}
Один полуработающий бред на другой точно не работающий заменил =)
 

DiMA

php.spb.ru
Команда форума
нет, ты голову забыл

твой новый IF тут же вылетит либо по BREAK, либо по DIE

я же написал, что старый бред был полуработающим, а новый - точно не работает :)
 

nexen

Новичок
хы хы хы - ну как не работает ! ) - новый бред выводит всегда "connvert failed..." а в первой версии какраз таки нормально всё работало поторопилсо . . .

-~{}~ 17.07.09 23:58:

версия 3

$str = '17 feb 2009';

function convert($str){
$mon = array(0 => 'jan', 1 => 'feb', 2 => 'mar', 3 => 'apr', 4 => 'may', 5 => 'jun', 6 => 'jul', 7 => 'aug', 8 => 'sep', 9 => 'oct', 10 => 'nov', 11 => 'dec');
$num = array(0 => '01', 1 => '02', 2 => '03', 3 => '04', 4 => '05', 5 => '06', 6 => '07', 7 => '08', 8 => '09', 9 => '10', 10 => '11', 11 => '12');
$str = explode(' ', $str);
for($i = 0; $i < 12; ++$i){
if($mon[$i] === $str[1]){
$date = $str[0].':'.$num[$i].':'.$str[2];
break;
}
}
return $date;
}
$res = convert($str);
echo $res;

p.s.
причем тут тупость и константы на года - все остальные значения цифровые, - текстовое только одно поэтому их просто берем из исходных
 

DiMA

php.spb.ru
Команда форума
ты выше 6 пунктов читал? читать умеешь?

что будет при $str = 'выпей_йаду'; ?

нахрен break, а не сразу return $date?

нахрен здесь цикл?

нахрен массив $num?
 

dimagolov

Новичок
nexen видимо мало того, что относится к неоперабельным пациентам, так еще и свято верит что его советы кому-то будут полезны :(
 

nexen

Новичок
Автор оригинала: dimagolov
nexen видимо мало того, что относится к неоперабельным пациентам, так еще и свято верит что его советы кому-то будут полезны :(
как знать. . . - я просто не стесняюсь своих ошибок, если даже их увидят все . . .в любом случае будет польза если код говно , - все увидят, как не надо делать, если нормальный - чтож, отлично! ))

$str = '17 mar 2009';

function convert($str){
$pat_a = "/[0-9]{2}/";
$pat_b = "/[0-9]{4}/";
$mon = array(0 => 'jan', 1 => 'feb', 2 => 'mar', 3 => 'apr', 4 => 'may', 5 => 'jun', 6 => 'jul', 7 => 'aug', 8 => 'sep', 9 => 'oct', 10 => 'nov', 11 => 'dec');
$num = array(0 => '01', 1 => '02', 2 => '03', 3 => '04', 4 => '05', 5 => '06', 6 => '07', 7 => '08', 8 => '09', 9 => '10', 10 => '11', 11 => '12');
$str = explode(' ', $str);
for($i = 0; $i < 12; ++$i){
if((preg_match($pat_a, $str[0])) && ($mon[$i] === $str[1]) && (preg_match($pat_b, $str[2]))){
$date = $str[0].':'.$num[$i].':'.$str[2];
break;
}
}
if($date){
return $date;
}
else{
die('incorrect value');
}
}
$res = convert($str);
echo $res;

p.s.
"1. 3 части нужно выделять регом" как это сочетается с "что будет при $str = 'выпей_йаду'; ?" ?, а что если "аааааааааааааааааааааааааааааааа" , а что если . . . , а что если . . . ТС по моему конкретный формат сроки указал 17 июля 2009 -> 2009-07-17 иначе бы я вообще не взялся , а то там каой то анализатор текста уже получается
 

DiMA

php.spb.ru
Команда форума
реги нужны не для того, что ты написал
нужно explode заменить на один рег и не плодить мусорных регов

> а что если

дружище, засунь любые свои высказывания не по теме программирования - в одно место, ок?

функция должна вернуть дату, только если она всесторонне корректна, или ошибку

попробуй "30 feb 9999"

3й раз повторяю - чтобы твой говнокод стал более похожим на код, нужно перебороть себя и избавиться от цикла
 

DiMA

php.spb.ru
Команда форума
если считать, что даты в пределах unixtime и соглашаться на автоматическое испрвление кривых дат в mktime, то весь твой код должен занимать 3 строки
PHP:
function getUnixtimeByString($str) {
    $month=explode(' ','jan feb mar apr may jun jul aug sep oct nov dec'); // FIXME локализовать и вынести в конфиг
    if (!preg_match("!(\d{1,2})[./\s]+(\w{3,4})[./\s]+(\d{4})!is", (string)$str, $reg)) return false;
    if (false===($monthNumber=array_search($reg[2], $month))) return false;
    return mktime(0,0,0,$monthNumber+1,$reg[1],$reg[3]);
} 
 
function getSqlDateByString($str) {
    return ($time=getUnixtimeByString($str)) ? date("Y-m-d", $time) : "0000-00-00";
}

echo getSqlDateByString('asdasd 12 asdasd 29 feb 2000 asdasd');
 

nexen

Новичок
"!(\d{1,2})[./\s]+(\w{3,4})[./\s]+(\d{4})!is"
'asdasd 05 asdasd 07 feb 2009 asdasd'
2009-02-07
p.s
тоже не айс
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху