Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование даты из локального формата, в мускульный 
:(
    Опции темы
Ciber SLasH
Дата 7.4.2006, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Не знаю как преобразовать локальный формат даты в формат MySQL. smile
Есть такой формат $lang['DateFormat']="%2\$s/%1\$s/%3\$s";, дата возвращается так:
Код

return sprintf ($lang['DateFormat'],$this->day,$this->month,$this->year);

где: $this->day - день, $this->month - месяц, $this->year - год. Эти значения известны при выводе даты.

Нужно, когда пользователь вводит в строку поиска дату такого же формата, то на сервере преобразовать эту дату к формату, который понимает MySQL.
Форматы зависят от текущей локали пользователя.

Каким образом можно сконвертировать локальный формат в мускульный? smile
PM   Вверх
CyClon
Дата 7.4.2006, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 1
Всего: 4



Не понял немного. Итак, что такое мускульный формат, примерчик можно? И еще, такого же формата, это какого?

Может...

Код
<?php

$string = "07.04.2006";
$date = explode(".", $string);
print_r($date);

?>


Вернет:

Цитата
Array
(
    [0] => 07
    [1] => 04
    [2] => 2006
)



--------------------
user posted image
PM   Вверх
Ciber SLasH
Дата 7.4.2006, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Неправильно объяснил на скорую руку...
В общем в БД хранятся записи, где есть поля даты в формате "YYYY-MM-DD". А при выводе даты пользователю, она может иметь различый формат (в зависимости от локали).
К примеру:
локаль: en_US; формат: "%2\$s/%1\$s/%3\$s"
локаль: en_GB; формат: "%s/%s/%s"
локаль: de_DE; "%s.%s.%s"

У каждого юзера своя локаль, в зависимости от географического расположения, поэтому они вводят дату в своём формате. Т.е. если у юзера локаль en_GB, то он вводит дату в виде 07/04/2006; если у юзера локаль en_US — то дата вида 04/07/2006; если у юзера локаль de_DE — то дата вида 07.04.2006 и т.д. Этих локалей куча и форматов тоже, т.к. эта система локализована на многие языки.

Вот и возникает коллизия, когда дата одна 07.04.2006, а выглядит она у различных юзеров совершенно по-разному, а в БД она железно прописана и в формате "YYYY-MM-DD" (2006-04-07).
Известно: локаль и формат и формат даты в БД.
Найти: преобразование даты из локального формата к формату БД, т.е. к формату "YYYY-MM-DD".

Вот собсна в чём вся загвоздка... smile
PM   Вверх
ZlojEzh
Дата 7.4.2006, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 2
Всего: 15



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

узаешь strptime и все ок
или я чего-то недопонял в постановке задачи?
PM MAIL ICQ   Вверх
Ciber SLasH
Дата 7.4.2006, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Цитата(ZlojEzh @ 8.4.2006, 00:04 Найти цитируемый пост)
а как ты формируешь дату при выводе пользователю?

Код

return sprintf ($lang['DateFormat'],$this->day,$this->month,$this->year);


Цитата(ZlojEzh @ 8.4.2006, 00:04 Найти цитируемый пост)
для этого, вроде, всегда нужно указывать формат строкового представления даты

Он и так строковый.

Цитата(ZlojEzh @ 8.4.2006, 00:04 Найти цитируемый пост)
то бишь - всегда знаешь в каком формате пользователь эту дату редактировал

Пользователь не редактирует дату. Ему выводится инфа вместе с датой, а он должен иметь возможность поиска в этой инфе по дате. Но дата у всех в разных форматах.

Цитата(ZlojEzh @ 8.4.2006, 00:04 Найти цитируемый пост)
узаешь strptime и все ок

Это конечно хорошая функция, но она работает только в PHP 5.1.0RC1 и выше, а надо чтобы работала и в 4-ке.
PM   Вверх
ZlojEzh
Дата 8.4.2006, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 2
Всего: 15



Код

  function mysql_date_from_str($date,$date_format) {
    preg_match_all("#%((\d)\\\$|)s#",$date_format,$match,PREG_SET_ORDER);
    //print_r($match);

    $regex = preg_replace("#%(\d\\\$|)s#","#num#",$date_format);
    $regex = preg_quote($regex);

    $regex = str_replace('#num#','(\d{2})',$regex);
    preg_match('#'.$regex.'#',$date,$m);
//    print_r($m);

    $result = array();
    for ($i=1;$i<count($m);$i++) {
      if (!empty($match[$i-1][2])) {
        $result[$match[$i-1][2]] = $m[$i];
      } else {
        $result[$i] = $m[$i];
      }
    }
    //print_r($result);
    $month = $result[2];
    $day   = $result[1];
    $year = '';
    if ($m[3]>50) $year = '19'.$result[3];
    else $year = '20'.$result[3];
    return $year.'-'.$month.'-'.$day;
  }


  $date_formats = array(
    "%2\$s/%1\$s/%3\$s",
    "%s/%s/%s",
    "%s.%s.%s"
    );
  $dates = array();
  foreach ($date_formats as $dt_f) {
    $date['date'] = sprintf ($dt_f,date('d'),date('m'),date('y'));
    $date['format'] = $dt_f;
    $dates[] = $date;
  }
  
  foreach ($dates as $date) {
    print $date['date']."\n";
    print mysql_date_from_str($date['date'],$date['format'])."\n\n";
  }

Output:
Код

04/08/06
2006-04-08

08/04/06
2006-04-08

08.04.06
2006-04-08


уфф...
коряво до безобразия, для любителя оптимизации - просто находка
но вроде работает

подкинь, плз, еще возможных форматов, надо протестить

строки не длинные, посему регекспы много времени занимать не должны
да и правила в них довольно строгие - быстрее работать будут
но если функция будет запускаться по сотне раз на странице - надо искать другой подход
PM MAIL ICQ   Вверх
Ciber SLasH
Дата 8.4.2006, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Цитата(ZlojEzh @ 8.4.2006, 01:25 Найти цитируемый пост)
уфф...

Да уж, намудрил. smile

Цитата(ZlojEzh @ 8.4.2006, 01:25 Найти цитируемый пост)
подкинь, плз, еще возможных форматов, надо протестить

Пожалуйста:
Цитата
"%3\$s-%2\$s-%1\$s"
"%s-%s-%s"

Спасибо за ответ, я так и думал, что придётся возиться с регами, но муторно это всё очень. Будем дальше думать...
PM   Вверх
CyClon
Дата 8.4.2006, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 1
Всего: 4



Вот, наварганил smile))

Код
<?php

$date['en_GB'] = "07/04/2006";
$date['en_US'] = "04/07/2006";
$date['de_DE'] = "07.04.2006";

function goDate($date)
{
    preg_match("#(\d{2})[/|.]{1}(\d{2})[/|.]{1}(\d{2,4})#", $date, $matches);
    if ($matches[1] == date("m")) {
        return $matches[3]."-".$matches[1]."-".$matches[2];
    } else {
        return $matches[3]."-".$matches[2]."-".$matches[1];
    }
}

echo goDate($date['en_GB'])."<br />\n";
echo goDate($date['en_US'])."<br />\n";
echo goDate($date['de_DE'])."<br />\n";

?>


Вернет нам:

Цитата
2006-04-07<br />
2006-04-07<br />
2006-04-07<br />


Как видишь, ввели три даты в разных форматах - получили те же три, но в одном формате. Код вроде не громоздкий. Задача решена? Или я опять чего-то не понял smile: ?
Добавлено @ 14:51
В обратную сторону:

Код
<?php

$date = "2006-04-07";

$date = explode("-", $date);

echo $date[2].".".$date[1].".".$date[0];

?>


Вернет нам:

Цитата
07.04.2006


Это сообщение отредактировал(а) CyClon - 8.4.2006, 14:47


--------------------
user posted image
PM   Вверх
ZlojEzh
Дата 8.4.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 2
Всего: 15



Input:
Код

  $date['en_GB'] = "07/03/2006";
  $date['en_US'] = "03/07/2006";
  $date['de_DE'] = "07.03.2006";

Output:
Код

2006-03-07
2006-07-03
2006-03-07

вывод: работает только для дат в пределах текущего месяца
PM MAIL ICQ   Вверх
Ciber SLasH
Дата 8.4.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



CyClon, нужно не для текущей даты, а для любой.
PM   Вверх
CyClon
Дата 8.4.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 1
Всего: 4



Да, сразу не сообразил. Хм, а что же тогда придумать? Как отличить en_GB от en_US? Интерестно smile


--------------------
user posted image
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0856 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.