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
Форумы портала PHP.SU :: Версия для печати :: Преобразование даты timestamp
Форумы портала PHP.SU » PHP » Программирование на PHP » Преобразование даты timestamp

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

1. LEONeso - 03 Февраля, 2011 - 22:41:19 - перейти к сообщению
Здравствуйте, объясните ,как лучше преобразовать 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
2. annihilus - 03 Февраля, 2011 - 22:49:38 - перейти к сообщению
а нельзя просто использовать функцию strtotime() ?
3. TM123 - 03 Февраля, 2011 - 22:56:58 - перейти к сообщению
DATE_FORMAT(date, '%d.%m.%Y')
4. LEONeso - 03 Февраля, 2011 - 23:05:27 - перейти к сообщению
TM123,
что-то пытаюсь и никак... выверка по дате ведь .
так?
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *, DATE_FORMAT(date, '%d.%m.%Y') FROM test ORDER BY date DESC
5. OrmaJever - 03 Февраля, 2011 - 23:35:31 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *, DATE_FORMAT(`date`, '%d.%m.%Y') FROM test ORDER BY `date` DESC

насколько я знаю date слово зарезервированое и должно братся в обратные кавычки
6. LEONeso - 03 Февраля, 2011 - 23:59:09 - перейти к сообщению
OrmaJever, вне зависимости от кавычек, результат прежний 0000/00/00 00:00:00
7. TM123 - 04 Февраля, 2011 - 00:25:41 - перейти к сообщению
date в смысле поле с датой
8. LEONeso - 04 Февраля, 2011 - 00:26:56 - перейти к сообщению
TM123 да
9. TM123 - 04 Февраля, 2011 - 00:28:41 - перейти к сообщению
думаю вместо * стоит перечислить поля ручками, MySQL это может не нравится, хотя я не понимаю почему
10. LEONeso - 04 Февраля, 2011 - 00:31:18 - перейти к сообщению
TM123 пробовал, без результатов.... одно и то же.
11. TM123 - 04 Февраля, 2011 - 00:35:50 - перейти к сообщению
Значит что-то неправильно делаете, не видя таблицы и диагностики сказать трудно.

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

Цитата:
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.
12. LEONeso - 04 Февраля, 2011 - 00:39:45 - перейти к сообщению
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.
13. OrmaJever - 04 Февраля, 2011 - 01:23:45 - перейти к сообщению
LEONeso пишет:
Ведь, чтоб форматирование работало, мало указать имя "столбца" для форматирования, надо указать и имя столбца для присвоения отформатированного значения

я сразу не заметил что там ещё * есть. Если без неёто все сложится в нулевой индекс масива.
14. TM123 - 04 Февраля, 2011 - 08:46:05 - перейти к сообщению
Я вам сказал способ как ускорить и упростить форматирование, а дальше ваша задача написать select так, чтобы это работало в вашем проекте, я так select не пишу и даже не мог представить что его так можно писать - это путь к потенциальным ошибкам.

Могу дать совет, не стоит писать as `название совпадающее с названием поля таблицы`, это ведет к потенциальным ошибкам и дополнительным тратам времени на отладку. Получая в одном месте в таком виде данные, можно воспринять это как само собой разумеющееся и в другом месте рассчитывать на это, получив не то что ожидалось придется заниматься отладкой, в процессе которой будет выяснена ошибка, но время будет истрачено. Вероятность возникновения проблемы увеличивается, если над проектом работаете не вы один.
15. jfr - 04 Февраля, 2011 - 21:08:51 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. ALTER TABLE vasha_table MODIFY pole date
если речь о базе идет...

 

Powered by ExBB FM 1.0 RC1