Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Формат вывода даты и времени


Автор: sani79 9.2.2007, 10:13
Добрый день! Снова обращаюсь за помощью к уважаемым коллегам. Проблема такая: нужно из MSSQL (тип поля datetime 8) вывести дату и время в формате заданным в локали. Попытался использовать strftime ничего не вышло, а точнее:

1.  
Код

strftime("%c", strtotime($row["InputTime"]))
 - выводит не зависимо от значения из базы "01/01/70 03:00:00"
2. 
Код

strftime("%c", $row["InputTime"])
 - то же что и в первом случае + ошибка:Notice: A non well formed numeric value encountered in ...

Подскажите пожалуйста в чем ошибка? Может есть другие варианты добится цели?

P.S. В базе значения хранятся в таком формате "11.09.2006 10:25:56". Если выводить 
Код

$row["InputTime"]
, то значения выводятся правильно, но не в том формате, вот в таком "27 янв 2007 7:27".

Автор: Shaggie 9.2.2007, 10:51
Проблема в формате, дата должна быть записана как "ГГГГ-ММ-ДД чч:мм:сс"

Если не можешь изменить формат хранения даты в БД, пользуйся регуляркой.

Код

strftime("%c", strtotime(preg_replace("/(\d{2})\.(\d{2})\.(\d{4})/", "$3-$2-$1", $row["InputTime"])));

Автор: sani79 9.2.2007, 12:54
Shaggie, Спасибо за совет. Изменить в базе действительно нереально. С вышеописанным кодом к сожалению не вышло, так ка окозалось что из базы у меня все таки возвращается в другом формате, а именно вот так: 30 янв 2007 17:41

Автор: Shaggie 9.2.2007, 13:18
Код

preg_match("/(\w{3})/",$row["InputTime"], $qw); // название месяца

switch($qw[0]) {
    case "янв": $month="01"; break;
    case "фев": $month="02"; break;
    case "мар": $month="03"; break;
    case "апр": $month="04"; break;
    case "май": $month="05"; break;
    case "июн": $month="06"; break;
    case "июл": $month="07"; break;
    case "авг": $month="08"; break;
    case "сен": $month="09"; break;
    case "окт": $month="10"; break;
    case "ноя": $month="11"; break;
    case "дек": $month="12"; break;
} // переводим в число

strftime("%c", strtotime(preg_replace("/(\d{2})\s\w{3}\s(\d{4})/", "$2-$month-$1", $row["InputTime"])));

Если я напорол с названиями месяцев - поправь.

Автор: sani79 9.2.2007, 18:12
Shaggie, Спасибо, это подходит.

Автор: AtomoS 18.10.2009, 11:59
Столкнулся с похожей проблеммой.

Есть таблица:
Код

CREATE TABLE `news` (
`id` int(11) NOT NULL auto_increment,
`title` tinytext NOT NULL,
`body` text NOT NULL,
`posted` date NOT NULL default '0000-00-00',
`autor` text NOT NULL,
`hide` enum('show','hide') NOT NULL default 'show',
PRIMARY KEY  (`id`));


Данные по времени хранятся в формате 0000-00-00

Вывожу данные (время) из таблицы:
Код

$query = "SELECT * FROM news order by id";
  $sql = mysql_query($query);
  while($news = mysql_fetch_array($sql))
{
    $posted = trim($news['posted']);
    $posted = trim($posted, 0);
    echo "$posted";
}


Время выводиться в формате 0000-00-00, а мненужно чтобы писало например: 21 Февраля 2009
__
Поможет кто в решении моей проблеммы?

Автор: AtomoS 19.10.2009, 10:33
Народ помогите решить проблемму... :(

Автор: bars80080 19.10.2009, 10:54
попробуй пропусти полученную дату через 
Код

date('j F Y', strtotime($posted));

Автор: AtomoS 19.10.2009, 12:15
Цитата(bars80080 @ 19.10.2009,  10:54)
попробуй пропусти полученную дату через 
Код

date('j F Y', strtotime($posted));

Спасибо, Это то что нужно, но дата прописалась по английски, существует ли способ перевести на русский?
__
и ещё, почему-то твой метод представил дату 2009-10-28 (или любую другую дату) как 1 January 1970.. что делать?

Автор: bars80080 19.10.2009, 13:52
Цитата(AtomoS @  19.10.2009,  12:15 Найти цитируемый пост)
и ещё, почему-то твой метод представил дату 2009-10-28 (или любую другую дату) как 1 January 1970.. 

значит не сработало, но как-то не понятно. проверь ещё отдельно, что выводит:

Код

$data = '2009-10-19';
$r = strtotime($data);
var_dump($r);
с разными $data

должно быть чисто таймстамп, что-то вроде 1236547890.


Цитата(AtomoS @  19.10.2009,  12:15 Найти цитируемый пост)
дата прописалась по английски, существует ли способ перевести на русский?

установить локаль системы на русский где-нибудь в начале кода:
Код

setlocale(LC_ALL, 'ru_RU');

Автор: AtomoS 19.10.2009, 15:22
bars80080, с русским языком разобрался в запрос базы добавил 
Код

mysql_query("SET NAMES cp1251");


Дату тоже починил...

теперь вопрос можно ли перевести дату на русский язык  22 October 2009 на  22 Октября 2009 через функцию какую-нибудь?

Автор: bars80080 19.10.2009, 15:40
Цитата(AtomoS @  19.10.2009,  15:22 Найти цитируемый пост)
теперь вопрос можно ли перевести дату на русский язык  22 October 2009 на  22 Октября 2009 через функцию какую-нибудь? 


Цитата(bars80080 @  19.10.2009,  13:52 Найти цитируемый пост)
установить локаль системы на русский где-нибудь в начале кода:

setlocale(LC_ALL, 'ru_RU');


Автор: AtomoS 19.10.2009, 15:48
bars80080, не помогает почему-то (

Автор: bars80080 19.10.2009, 15:53
точно? а где вставляешь? покаж код

Автор: AtomoS 19.10.2009, 16:01
Код
кому надо тот уже посмотрел

Автор: bars80080 19.10.2009, 16:06
ну, тогда заместо date используй функцию date_ru
и закинь её к себе:

Код

function date_ru($f = '', $d = '', $k = 0) {
    if(!empty($d)) { $res = date($f, $d); }
    else { $res = date($f); }
    $e1 = array('Mon','Tue','Wed','Thu','Fri','Sut','Sun');
    $e2 = array('Monday','Tuesday','Wednesday','Thursday','Friday','Suturday','Sunday');
    $e3 = array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
    $e4 = array('January','February','March','April','May','June','July','August','September','October','November','December');
    $e5 = array('st', 'nd', 'rd', 'th', 'am', 'pm');
    $r1 = array('Пн','Вт','Ср','Чт','Пт','Сб','Вс');
    $r2 = array('Понедельник','Вторник','Среда','Четверг','Пятница','Суббота','Воскресенье');
    $r3 = array('Янв','Фев','Мар','Апр','Май','Июн','Июл','Авг','Сен','Окт','Ноя','Дек');
    $r41 = array('Января','Февраля','Марта','Апреля','Мая','Июня','Июля','Августа','Сентября','Октября','Ноября','Декабря');
    $r42 = array('Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь');
    $r5 = array('ое','ое','ье','ое','дп','пп');
    if($k == 1) $r4 = $r42; else $r4 = $r41;
    $res = str_replace($e2, $r2, $res);
    $res = str_replace($e1, $r1, $res);
    $res = str_replace($e4, $r4, $res);
    $res = str_replace($e3, $r3, $res);
    $res = str_replace($e5, $r5, $res);
    return $res; }


Автор: AtomoS 19.10.2009, 16:33
bars80080, спасибо за функцию, теперь разобрался что к чему) Работает!

Автор: Kevin 19.10.2009, 16:36
Для полноты картины, хотелось бы отметить, 
что в русском языке название месяца и дня недели 
не являются именами собственными (в отличие 
от английского языка, где — являются), 
а значит, пишутся со строчной буквы. 

Не сочтите за оффтоп ;-)

Автор: AtomoS 19.10.2009, 16:42
Та это не важно) всеровно 50% в функции для меня лишнего) уже убрал правда)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)