Версия для печати темы

Нажмите сюда для просмотра этой темы в оригинальном формате

WinCity.Ru _ Программирование _ php, mysql

Автор: Edmund Вторник, 14 Марта 2006, 2:15

Народ, помогите разобраться. БД хранит дату почему-то в формате YYYY-MM-DD. А я привык и мои друзья для которых я делаю простенькую страничку к формату DD-MM-YYYY. Что мне посоветуете?

Автор: zeroku Вторник, 14 Марта 2006, 11:50

так перед тем как попасть в БД, скорее всего дата как то определяется.
А в том файле, с которого ты собираешься записывать в БД делаешь

$date = date("d-m-Y");

затем

$sql= mysql_query("INSERT INTO ...");

и я думаю , что все

Автор: Админ Вторник, 14 Марта 2006, 16:33

Выбранную из БД дату преобразовать премерно так:
$d = date("d-m-Y",$date_from_db);

Автор: Edmund Среда, 15 Марта 2006, 0:04

Спасибо ребята но проблема похоже глубже.

В БД установлен формат представления Даты в виде Y-M-D соответственно если я буду пытаться писать в БД например 01.01.2000 в в неё запишется 0001.01.20 или что-то подобное, уже пробовал. Возможно это можно изменить в настройках но я не нашёл где.
Второе: выражение вида $d = date("d-m-Y",$date_from_db); выдаёт 01-01-1970 на любую дату которая была в БД. Возможно её сначала к какому-то другому виду привести надо?
Не знаю уж что делать всю лоступную доку перерыл ничего нет тут только опыт поможет.

Автор: pan Среда, 15 Марта 2006, 8:41

Edmund, дату в БД хранить советую в виде unix-timestamp'а. Т.е. в виде кол-ва секунд, прошедших с начала эпохи (1.01.1970).

Таким образом, отведя для даты VARCHAR(20), ты можешь хранить там числовую метку вида, например, 113811123. Эта метка получается функцией time() - она возвращает ТЕКУЩЕЕ кол-во секунд, прошедших с начала этой самой эпохи.

В БД пиши именно timestamp. После выборки данных из БД, timestamp пропускается через функцию, например, date:

Код
// пусть $row['date'] = 113811123 - timestamp нужной нам даты

echo date("l dS of F Y h:i:s A", $row['date']);
// выведет "Friday 10th of August 1973 05:12:03 PM"


Если так проблему не получится решить, то приведи сюда sql-код для создания той таблицы, что ты используешь - попросту говоря ее дамп. Посмотрим...

Добавлено GeizeR, [mergetime]1142401025[/mergetime]
Для справки:
http://ru.php.net/time
http://ru.php.net/date
http://ru.php.net/strtotime
http://ru.php.net/getdate

Автор: zeroku Среда, 15 Марта 2006, 10:52

Цитата(GeizeR @ Среда, 15 Марта 2006, 5:41)
Edmund, дату в БД хранить советую в виде unix-timestamp'а. Т.е. в виде кол-ва секунд, прошедших с начала эпохи (1.01.1970).

Таким образом, отведя для даты VARCHAR(20), ты можешь хранить там числовую метку вида, например, 113811123. Эта метка получается функцией time() - она возвращает ТЕКУЩЕЕ кол-во секунд, прошедших с начала этой самой эпохи.

В БД пиши именно timestamp. После выборки данных из БД, timestamp пропускается через функцию, например, date:

Код
// пусть $row['date'] = 113811123 - timestamp нужной нам даты

echo date("l dS of F Y h:i:s A", $row['date']);
// выведет "Friday 10th of August 1973 05:12:03 PM"


Если так проблему не получится решить, то приведи сюда sql-код для создания той таблицы, что ты используешь - попросту говоря ее дамп. Посмотрим...

Добавлено GeizeR, [mergetime]1142401025[/mergetime]
Для справки:
http://ru.php.net/time
http://ru.php.net/date
http://ru.php.net/strtotime
http://ru.php.net/getdate
*



спасибо, Сань!
очень помогло и мне))
оказывается много нового узнал тока что

Автор: Edmund Четверг, 16 Марта 2006, 1:11

Спасибо, GeizeR. Дамп с этой БД :

Код
Datenbank driv auf localhost
# phpMyAdmin SQL Dump
# version 2.5.3
# http://www.phpmyadmin.net
#
# Host: localhost
# Erstellungszeit: 15. März 2006 um 22:30
# Server Version: 4.0.15
# PHP-Version: 4.3.4
#
# Datenbank: `driv`
#

# --------------------------------------------------------

#
# Tabellenstruktur für Tabelle `aktivitet`
#

CREATE TABLE `aktivitet` (
 `id` int(11) NOT NULL auto_increment,
 `date_an` date NOT NULL default '0000-00-00',
 `date_zu` date default '0000-00-00',
 `iniziator` varchar(100) NOT NULL default 'DRIV',
 `name` varchar(100) NOT NULL default '',
 `beschreibung_kurz` varchar(200) default NULL,
 `link` varchar(100) default NULL,
 PRIMARY KEY  (`id`)
) TYPE=MyISAM COMMENT='Aktiviteten des Verein' AUTO_INCREMENT=48;

#
# Daten für Tabelle `aktivitet`
#

INSERT INTO `aktivitet` VALUES (1, '2006-11-07', '2006-04-30', ' Integrationsrat MG', ' Runder Tisch', '', 'http://localhost/aktiv.php');

но главное, что дата должна вводиться из формы, а не как текущая дата. В форму вводится планируемая дата в привычном виде (dd-mm-yyyy). Соответственно если хранить дату в юникс-формате то её как-то преобразовать нужно сначало в формат yyyy-mm-dd (ещё не представляю как это сделать, строковыми функциями можно себе мозги свернуть да и выглядит это неэлегантно) а затем как timestamp и сохранять в БД. Этот-то этап мне и не нравится. Неужели нельзя заставить mySQL хранить дату по человечески в привычном для европейцев формате?

Автор: pan Четверг, 16 Марта 2006, 10:38

Используй этот sql:

Код
CREATE TABLE `aktivitet` (
`id` int(11) NOT NULL auto_increment,
`date_an` date NOT NULL default '0000-00-00',
`date_zu` date default '0000-00-00',
`timestamp` varchar(20) default NULL,
`iniziator` varchar(100) NOT NULL default 'DRIV',
`name` varchar(100) NOT NULL default '',
`beschreibung_kurz` varchar(200) default NULL,
`link` varchar(100) default NULL,
PRIMARY KEY  (`id`)
) TYPE=MyISAM COMMENT='Aktiviteten des Verein' AUTO_INCREMENT=48;


Цитата(Edmund @ Сегодня, 9:11)
но главное, что дата должна вводиться из формы, а не как текущая дата. В форму вводится планируемая дата в привычном виде (dd-mm-yyyy).

Есть функция strtotime() (http://ru.php.net/strtotime). Она совершает операции, обратные функции date - по введенной дате в GNU формате она возвращает ее (даты) timestamp. Возвращает -1, если введенная дата не соответствует GNU формату. Так вот, получив от юзера с формы дату, ты проверяешь ее следующим образом (из оф. мануала PHP):
Код
<?php
// $_POST['date'] - предполагается, что поле с датой на форме имеет имя date, а форма - метод post
if (($timestamp = strtotime($str)) === -1) {
   echo "Строка ($str) недопустима";
} else {
   echo "$str == " . date('l dS of F Y h:i:s A', $timestamp);
}
?>

Таким образом, введя в поле "Дата" значение "12-12-2005", ты получишь timestamp = 1527426000. Что, естесственно неверно. Поэтому код, приведенный выше, надо преобразовать так:
Код
// $_POST['date'] - предполагается, что поле с датой на форме имеет имя date, а форма - метод post
$_POST['date'] = str_replace(" ", "", $_POST['date']); // убираем пробелы
// тут вставь проверку на корректность введенных данных (см. регулярные выражения)
// получаем день, месяц, год
list($day, $month, $year) = explode("-", $_POST['date']);
// преобразовываем в GNU формат (согласен, страшно выглядит, но можно и причесать)
$new_date = $year."-".$month."-".$day;
// все, у тебя есть введенная юзером дата в GNU формате. Теперь прогоняем через strtotime()
if (($timestamp = strtotime($new_date)) === -1) {
   echo "Строка ($new_date) недопустима";
} else {
   echo "$new_date == " . date('l dS of F Y h:i:s A', $timestamp);
}


Цитата
Неужели нельзя заставить mySQL хранить дату по человечески в привычном для европейцев формате?

Можно сделать все. Но лучше, как говорится, переустройство мира начать с самого себя - привыкай делать так, как надо, а не менять под себя.

Добавлено GeizeR, [mergetime]1142494735[/mergetime]
Да, кстати. К слову о форме и поле для ввода даты пользователем: лучше сделай три выпадающих списка:
ДЕНЬ МЕСЯЦ ГОД
Уверен, видел в интернете. И с такими разделенными данными будет работать и тебе и пользователю гораздо проще.

Автор: Edmund Четверг, 16 Марта 2006, 11:15

Большое спасибо GeizeR за внимание и терпение, ты избавил меня от головной боли. Был бы рад бы ть тебе чем-то полезным. До свидания.beer.gif

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