Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Преобразование даты timestamp

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: 0000/00/00 00:00:00 в d.m.Y
LEONeso
Отправлено: 03 Февраля, 2011 - 22:41:19
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




Здравствуйте, объясните ,как лучше преобразовать timestamp вида 0000/00/00 00:00:00 в обычную дату d.m.Y.

Нашел такой способ:
CODE (htmlphp):
скопировать код в буфер обмена
  1. 2000/05/27 02:40:21 PM

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. // строка полученная из Access
  4. $date_time_string = '2000/05/27 02:40:21 PM';
  5.  
  6. // Разбиение строки в 3 части - date, time and AM/PM
  7. $dt_elements = explode(' ',$date_time_string);
  8.  
  9. // Разбиение даты
  10. $date_elements = explode('/',$dt_elements[0]);
  11.  
  12. // Разбиение времени
  13. $time_elements =  explode(':',$dt_elements[1]);
  14.  
  15. // Если у нас время в формате PM мы можем добавить 12 часов для получения  24 часового формата времени
  16. if ($dt_elements[2] == 'PM') {
  17.     $time_elements[0] += 12;
  18. }
  19.  
  20. // вывод результата
  21. echo mktime($time_elements[0], $time_elements[1],$time_elements[2], $date_elements[1],$date_elements[2], $date_elements[0]);
  22.  
  23. ?>


Но он достаточно громоздкий и допустим в цикле из 1000+ записей, будет весьма долго работать.

В книге "MySQL Сборник рецептов" от Поль Дюбуа нашел в главе 5.5 - Разбиение дат и времени с помощью функции извлечения составляющих, функции типа "YEAR() - год даты, MONTH() - месяцы 1-12, DAYOFMONTH() - день месяца 1-31"

Вопросы:
1. Возможно ли на уровне запроса, выверки из базы данных, изменить получаемые даты из таблицы и выводить уже преобразованную дату?

2. Если "да", то как грамотно составить запрос? пример таблицы: id, name, date

(Отредактировано автором: 03 Февраля, 2011 - 22:42:16)



-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
annihilus
Отправлено: 03 Февраля, 2011 - 22:49:38
Post Id



Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




а нельзя просто использовать функцию strtotime() ?
 
 Top
TM123
Отправлено: 03 Февраля, 2011 - 22:56:58
Post Id


Новичок


Покинул форум
Сообщений всего: 35
Дата рег-ции: Нояб. 2010  
Откуда: Москва


Помог: 0 раз(а)




DATE_FORMAT(date, '%d.%m.%Y')


-----
Программим потихоньку http://www[dot]altycon[dot]ru
 
 Top
LEONeso
Отправлено: 03 Февраля, 2011 - 23:05:27
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




TM123,
что-то пытаюсь и никак... выверка по дате ведь .
так?
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *, DATE_FORMAT(date, '%d.%m.%Y') FROM test ORDER BY date DESC

(Отредактировано автором: 03 Февраля, 2011 - 23:25:14)



-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
OrmaJever Модератор
Отправлено: 03 Февраля, 2011 - 23:35:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *, DATE_FORMAT(`date`, '%d.%m.%Y') FROM test ORDER BY `date` DESC

насколько я знаю date слово зарезервированое и должно братся в обратные кавычки

(Отредактировано автором: 03 Февраля, 2011 - 23:35:42)



-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
LEONeso
Отправлено: 03 Февраля, 2011 - 23:59:09
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




OrmaJever, вне зависимости от кавычек, результат прежний 0000/00/00 00:00:00


-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
TM123
Отправлено: 04 Февраля, 2011 - 00:25:41
Post Id


Новичок


Покинул форум
Сообщений всего: 35
Дата рег-ции: Нояб. 2010  
Откуда: Москва


Помог: 0 раз(а)




date в смысле поле с датой


-----
Программим потихоньку http://www[dot]altycon[dot]ru
 
 Top
LEONeso
Отправлено: 04 Февраля, 2011 - 00:26:56
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




TM123 да


-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
TM123
Отправлено: 04 Февраля, 2011 - 00:28:41
Post Id


Новичок


Покинул форум
Сообщений всего: 35
Дата рег-ции: Нояб. 2010  
Откуда: Москва


Помог: 0 раз(а)




думаю вместо * стоит перечислить поля ручками, MySQL это может не нравится, хотя я не понимаю почему


-----
Программим потихоньку http://www[dot]altycon[dot]ru
 
 Top
LEONeso
Отправлено: 04 Февраля, 2011 - 00:31:18
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




TM123 пробовал, без результатов.... одно и то же.


-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
TM123
Отправлено: 04 Февраля, 2011 - 00:35:50
Post Id


Новичок


Покинул форум
Сообщений всего: 35
Дата рег-ции: Нояб. 2010  
Откуда: Москва


Помог: 0 раз(а)




Значит что-то неправильно делаете, не видя таблицы и диагностики сказать трудно.

Вот выдержка из документации, у меня работает все нормально.

Цитата:
DATE_FORMAT(date,format)

Форматирует величину date в соответствии со строкой format. В строке format могут использоваться следующие определители:
Определитель Описание
%M Название месяца (январь...декабрь)
%W Название дня недели (воскресенье...суббота)
%D День месяца с английским суффиксом (0st, 1st, 2nd, 3rd и т.д.)
%Y Год, число, 4 разряда
%y Год, число, 2 разряда
%X Год для недели, где воскресенье считается первым днем недели, число, 4 разряда, используется с '%V'
%x Год для недели, где воскресенье считается первым днем недели, число, 4 разряда, используется с '%v'
%a Сокращенное наименование дня недели (Вс...Сб)
%d День месяца, число (00..31)
%e День месяца, число (0..31)
%m Месяц, число (00..12)
%c Месяц, число (0..12)
%b Сокращенное наименование месяца (Янв...Дек)
%j День года (001..366)
%H Час (00..23)
%k Час (0..23)
%h Час (01..12)
%I Час (01..12)
%l Час (1..12)
%i Минуты, число (00..59)
%r Время, 12-часовой формат (hh:mm:ss [AP]M)
%T Время, 24-часовой формат (hh:mm:ss)
%S Секунды (00..59)
%s Секунды (00..59)
%p AM или PM
%w День недели (0=воскресенье..6=суббота)
%U Неделя (00..53), где воскресенье считается первым днем недели
%u Неделя (00..53), где понедельник считается первым днем недели
%V Неделя (01..53), где воскресенье считается первым днем недели. Используется с '%X'
%v Неделя (01..53), где понедельник считается первым днем недели. Используется с '%x'
%% Литерал ‘%’.

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

mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
-> 'Saturday October 1997'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%D %y %a %d %m %b %j');
-> '4th 97 Sat 04 10 Oct 277'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
-> '1998 52'

В MySQL 3.23 символ ‘%’ должен предшествовать символам определителя формата. В более ранних версиях MySQL символ ‘%’ необязателен.

Причина того, что промежутки для месяца и дня начинаются с нуля заключается в том, что MySQL позволяет использовать неполные даты, такие как '2004-00-00', начиная с MySQL 3.23.


-----
Программим потихоньку http://www[dot]altycon[dot]ru
 
 Top
LEONeso
Отправлено: 04 Февраля, 2011 - 00:39:45
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




TM123, на самом деле не видно, чтобы он присваивал новое значение (отформатированное) к значению поля date. Данная операция, возможно предназначена для записи и сверки данных?
---
Пригляделся в примеры кода форматирования даты в книге (глава 5.11)... результат оказался рабочим.

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

рабочий пример:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *,DATE_FORMAT(date, '%d.%m.%Y') AS 'date' FROM test ORDER BY 'date' DESC

аналогичен
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *,DATE_FORMAT(date, '%d.%m.%Y') AS 'date' FROM test ORDER BY date DESC


---
Всем спасибо, возможно не мне одному пригодится т.к. работает быстрее чем функция php.

(Отредактировано автором: 04 Февраля, 2011 - 00:54:57)



-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
OrmaJever Модератор
Отправлено: 04 Февраля, 2011 - 01:23:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




LEONeso пишет:
Ведь, чтоб форматирование работало, мало указать имя "столбца" для форматирования, надо указать и имя столбца для присвоения отформатированного значения

я сразу не заметил что там ещё * есть. Если без неёто все сложится в нулевой индекс масива.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
TM123
Отправлено: 04 Февраля, 2011 - 08:46:05
Post Id


Новичок


Покинул форум
Сообщений всего: 35
Дата рег-ции: Нояб. 2010  
Откуда: Москва


Помог: 0 раз(а)




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

Могу дать совет, не стоит писать as `название совпадающее с названием поля таблицы`, это ведет к потенциальным ошибкам и дополнительным тратам времени на отладку. Получая в одном месте в таком виде данные, можно воспринять это как само собой разумеющееся и в другом месте рассчитывать на это, получив не то что ожидалось придется заниматься отладкой, в процессе которой будет выяснена ошибка, но время будет истрачено. Вероятность возникновения проблемы увеличивается, если над проектом работаете не вы один.


-----
Программим потихоньку http://www[dot]altycon[dot]ru
 
 Top
jfr
Отправлено: 04 Февраля, 2011 - 21:08:51
Post Id



Посетитель


Покинул форум
Сообщений всего: 332
Дата рег-ции: Март 2010  
Откуда: Таджикистан, Худжанд


Помог: 0 раз(а)

[+]


CODE (SQL):
скопировать код в буфер обмена
  1. ALTER TABLE vasha_table MODIFY pole date
если речь о базе идет...
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB