Антоним функции date()

Gluk

Новичок
Антоним функции date()

Как можно перевести строку с датой в timestamp на основе того же формата?

date($myformat) возвращает строку, а вот чтобы пользователь ввел дату и перевести ее в timestamp для хранения в бд?!

$myformat может отличаться в разных языковых версиях. Я вот думаю, может preg_split'ом можно вернуть как нибудь год, месяц и день в виде массива в нужном порядке?

Заранее спасибо!
 

jonjonson

Guest
strtotime () ?
http://www.php.net/manual/ru/function.strtotime.php
 

Gluk

Новичок
ну и как ей извлечь с заданным форматом? может у меня сначала месяц идет, а потом день, как в США пишут.
:)
 

TuBu

Guest
Gluk
mktime и не хрен извращаться

а если ты не знаешь формат входящей даты, то с чего ты решил, что strtotime должен ее распознать?
 

Gluk

Новичок
пользователь вводит дату, а не mktime! причем формат вводимой даты зависит от настроек пользователя (может быть 31/11/2004, а может 11.31.2004, а может вообще 31 - 11 - 2004).

и с чего ты взял, что это я решил, что strtotime может мне помочь?
 

Kirs

Fireman
Gluk
Фигня у тебя какаято. Если пользователь введет 11.11.04 как ты определиш где там месяц а где день если он их у тебя как хочешь ставить может? Стандартизируй в таком случае хотябы порядок цифр, далее preg_match() и mktime().
 

jonjonson

Guest
Gluk, приведение даты к единому виду - это твоя личная проблема. Если ты решил работать с кашей, а не данными, и тебя не устраивает strtotime, то пиши свою функцию, которая бы понимала все требуемые тебе форматы даты и времени (ты хотябы их знаешь?).
 

Gluk

Новичок
может я и извращенец, но так надо! может кому пригодится функция
PHP:
        	$format = "d.m.Y H:i:s";
        	$vals = array("m", "n", "d", "j", "y", "Y", "G", "H", "i", "j", "s");
            $q = 0;
            $n = 0;
            for ($i = 0; $i < strlen($format); $i++)
            {
            	if (in_array($format[$i], $vals))
                {
                	$digit = '';
                    $q = $i-$n+$q;
                	while (is_numeric($timestamp[$q]))
                    {
                    	$digit .= $timestamp[$q++];
                    }
                    --$q;
                    $n = $i;
                    $d[$format[$i]] = $digit;
                }
            }

            // year
            if (!empty($d["y"]))
            	$year = $d["y"];
            else $year = $d["Y"];

            // month
            if (!empty($d["m"]))
            	$month = $d["m"];
            else $month = $d["n"];

            // day
            if (!empty($d["d"]))
            	$day = $d["d"];
            else $day = $d["j"];

            // hours
            if (!empty($d["H"]))
            	$hour = $d["H"];
            else $hour = $d["G"];

            // minutes
            if (!empty($d["H"]))
            	$minute = $d["H"];
            else $minute = $d["G"];

            // second
           	$second = $d["s"];

            return date("YmdHis", mktime($hour, $minute, $second, $month, $day, $year));
 

Gluk

Новичок
Автор оригинала: jonjonson
Gluk, и шо це таке як утюг?
конвертирует дату и время в указанном формате для поля TIMESTAMP в MySQL, хотя если в последней функции менять формат, можно конвертировать во что угодно :)
 

jonjonson

Guest
Gluk, во-первых, фугкция это когда нечто такое...
PHP:
function FunctionName ($parametr)
{
    // code ...

    return $result;
}
Во-вторых, что мы конвертим и для чего, я так и не понял...
 

Gluk

Новичок
чтобы пользователь из США мог вводить дату в привычном для него формате ММ/ДД/ГГГГ, а пользователь из России в своем ДД.ММ.ГГГГ. И чтобы потом можно было выводить пользователю из России дату, введенную пользователем из США, в привычном для Россиянина формате.

а насчет функции - лень дописывать было ;)
 

jonjonson

Guest
Кроме того timestamp в PHP и TIMESTAMP в MySQL разные вещи.
 

Gluk

Новичок
я знаю! значение TIMESTAMP в MySQL можно понять без всяких обработок :)
 

4m@t!c

Александр
Вопрос. А возможно сделать интерфейсно выбор даты? Т.е. окно для числа, окно для месяца, окно для года(или выпадающий пункт меню). Время в БД хранить в формате Unix. А так, тебе нужно знать порядок следования года, месца, числа - по-другому - никак.
 

Gluk

Новичок
я думал об этом! но было одно НО - мне слишком много переделывать бы пришлось! :)
 

jonjonson

Guest
4m@t!c, ИМХО не совсем удобен такой интерфейс.
 

_RVK_

Новичок
А так, тебе нужно знать порядок следования года, месца, числа - по-другому - никак
Как! У него же есть строка формата, значит он знает где месяц а где день. Другое дело, что лучше элементы даты-времени хранить в отдельных полях, сразу разбирая в зависимости от настроек юзера. И при выводе тогда гемороя не будет, банальный mktime и date.

-~{}~ 13.01.05 10:39:

Gluk
Как ты определяешь в каком формате юзер ввел дату? У него есть соответствующая настройка?
jonjonson
4m@t!c, ИМХО не совсем удобен такой интерфейс
Наоборот удобно и меньше возможности сделать ошибку в формате.

-~{}~ 13.01.05 10:43:

Gluk
И еще скажи, у тебя личная неприязнь к регулярным выражениям?
 

Gluk

Новичок
да! у каждого пользователя личная настройка!
а насчет регулярных выражений - ну никак не могу освоить :)
 

_RVK_

Новичок
Вот пример твоей функции но с регами. Проверки я опустил и чуток упростил формат. Учи реги, от них никуда не деться :)
PHP:
function date2time($format,$datetime) {
    //Разбираем строку формата
    preg_match_all('/.*?((m|d|y|h|i|s)).*?/',$format, $format_arr);
    //Разбираем строку времени
    preg_match_all('/.*?([0-9]+).*?/',$datetime,$datetime_arr);
    //Сопоставляем формат с данными
    $i = 0;
    foreach ($format_arr[1] as $char) {
        $arr[$char] = $datetime_arr[1][$i++];
    }
    //Получаем время в формате UNIX timestamp
    return mktime($arr['h'],$arr['i'],$arr['s'],$arr['m'],$arr['d'],$arr['y']);
}

$format = 'm-d-y h:i:s';
$datetime = '01-13-05 9:55:10';
print $time = date2time($format,$datetime);
//Для проверки
print '<br/>Проверка:'.date($format,$time);
-~{}~ 13.01.05 11:07:

Gluk
да! у каждого пользователя личная настройка!
Короче, самый лучший вариант сразу при вводе даты разбирать её на компонеты, в зависимости от настройки юзера, и записывать в соответствующие поля в БД. При выводе использоавть [m]mktime[/m]
 
Сверху