Как из строки "15.03.2008" c помощью стандартных функций получить Unix timestamp?

Бочонок

http://frontender.info
Как из строки "15.03.2008" c помощью стандартных функций получить Unix timestamp?

Приятного времени суток.
Клиент передает дату в формате dd.mm.yyyy.
Надо из нее получить Unix timestamp.
Есть ли стандартные функции в php которые позволят это сделать?
Я, признаться, совсем в мане потерялся.
Подскажите в какую сторону смотреть, пожалуйста.
 

Бочонок

http://frontender.info
Ой.
А я пока суть да дело сделал так:
PHP:
$end_time = explode('.','15.03.2008');
mktime(0,0,0,$end_time[1],$end_time[0],$end_time[2]);
Спасибо за ответ!
Теперь у меня даже двумя способами получается сделать.
Кстати - а какой лучше использовать по вашему мнению?
 

vovanium

Новичок
По старой перловой привычке делаем примерно так:

PHP:
if(preg_match('~^(\d{1,2})\D(\d{1,2})\D(\d{4})$~','15.03.2008', $m)){
return mktime(0,0,0,$m[2],$m[1],$m[3]);
}
else {
return false;
}
Благодаря чему и формат сразу проверяем, да и разделитель не важен, к примеру, можно ввести 15-03-2008 или 15/3/2008
а strtotime не всегда правильно понимает, что стоит вначале день или месяц.
 

kode

never knows best
Хватит придумывать велосипеды....

http://ru2.php.net/manual/en/function.strptime.php
PHP:
$date    = "15.03.2008";
$format =  "%d.%m.%Y";

echo date2unix($date,$format);

function date2unix($time,$format="%d.%m.%Y"){
$time = strptime($date,$format);

return mktime($time['tm_hour'], $time['tm_min'], $time['tm_sec'],  $time['tm_mon'],$time['tm_mday'], $time['tm_year']);
}
 

Фанат

oncle terrible
Команда форума
Бочонок
все правильно, только запомни, поговорка звучит "пока суд, да дело"
 

kode

never knows best
Автор оригинала: vovanium
kode

Классный не велосипед, особенно учитывая что функция только в PHP 5.1 появилась, и не реализована под той же виндой :)
Меня не волнуют ретрограды и вантузойды :D
 

vovanium

Новичок
Меня не волнуют ретрограды и вантузойды
Ну да конечно написать в требованиях PHP 5.2.5 и выше и никаких виндов это отличный метод :D
Главное заюзать функцию которую с легкостью заменяет одна регулярка, которая к тому же будет быстрее работать :)
 

kode

never knows best
Автор оригинала: vovanium
Ну да конечно написать в требованиях PHP 5.2.5 и выше и никаких виндов это отличный метод :D
Главное заюзать функцию которую с легкостью заменяет одна регулярка, которая к тому же будет быстрее работать :)
А вы уверены что ваша регулярка более универсальна, глобальна и надёжна? :D
 

vovanium

Новичок
А вы уверены что ваша регулярка более универсальна, глобальна и надёжна?
1. Она более универсальна для данной задачи, так как позволяет использовать различные разделители.
2. Более глобальна, да так будет работать и на древних версиях php 4 и на виндах.
3. Чем проще механизм, тем он надежнее ;)
 

kode

never knows best
Автор оригинала: vovanium
Ну да конечно написать в требованиях PHP 5.2.5
Кстате смотри выше: как минимум снапшот 5.2.6, а лучше 6 :cool:

PS/"Глобально и надёжно" - это ирония
 

kpp

Новичок
vovanium
'~^(\d{1,2})\D(\d{1,2})\D(\d{4})$~'

быстрее, но криво... '99.99.2009'... проходит со свистом по твоему правилу.
 

WP

^_^
> Классный не велосипед, особенно учитывая что функция только в PHP 5.1 появилась, и не реализована под той же виндой
Гон. Реализовано.
 

shureen

Милорд Лось Кристофер
Если доверять данным, то можно просто с помощью стандартных функций без всяких регулярных выражений написать
PHP:
$text = '19.03.08';
mktime(0, 0, 0, substr($text, 3, 2), substr($text, 0, 2), substr($text, 6, 4));
 

vovanium

Новичок
WP
Гон. Реализовано.
Это ты с php.net выясняй ;)
http://ua2.php.net/strptime/
Note: This function is not implemented on Windows platforms.

У меня PHP 5.2.4 на винде не знает этой функции

kpp
быстрее, но криво... '99.99.2009'... проходит со свистом по твоему правилу.
mktime позволяет такой формат, к примеру если введешь 30.02.2008, то в результате получишь дату 01.03.2008

С strptime кроме как проблем с ограниченной совместимостью (PHP 5.1+ и не винда). Более того там в примере ошибка, в этой функции месяцы от 0 до 11, соответственно для месяца в mktime нужно делать +1

Но это еще не все приколы:
для 29.02.2008 -> 29.02.2008
для 31.02.2008 -> 02.03.2008
но для 32.02.2008 -> false

Что касается моей функции, если нужно чтобы для несуществующих дат выдавалось false, то нужно сделать небольшую добавку. И это функция будет правильно проверять все даты ;) Заодно она понимает сокращенный формат к примеру 18.3.08 или даже 18/3/8 и т.п. разделитель может быть любой.
PHP:
function str2time($date){
	if(preg_match('~^(\d{1,2})\D(\d{1,2})\D(\d{1,4})$~', $date, $m) && checkdate($m[2],$m[1],$m[3])){
		return mktime(0,0,0,$m[2],$m[1],$m[3]); 
	} 
	else { 
		return false; 
	}
}

$time = str2time('30.02.2008');
echo $time ? date('r', $time) : 'false';
 
Сверху