[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как лучше разбить строку?
iVasya
Есть строка с датой такого формата:
24.06.2012 23:00
Нужно из нее вытащить отдельно год, отдельно месяц и отдельно все остальное.
Какой вариант наиболее оптимальный (с точки зрения быстродействия и что б говнокодом не было)?
Я пока только такой вижу:
С помощью explode() разбивать эту строку. сначала с разделителем точка, потом пробел, потом двоеточие. В итоге все будет по отдельным ячейкам разных массивов.
Напишите свой, более правильный и быстрый алгоритм.



Спустя 8 минут, 59 секунд (25.06.2012 - 00:18) Игорь_Vasinsky написал(а):
я бы тож так и делал.
$date = "24.06.2012 23:00";

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

$dateOnly = explode(".", $arr[0]);

$time = $arr[1];
$year = $dateOnly[2];
$mount = $dateOnly[1];
$day = $dateOnly[0];

Спустя 49 минут, 9 секунд (25.06.2012 - 01:08) Invis1ble написал(а):
$data = preg_split('#[.: ]#', '24.06.2012 23:00');

Спустя 8 часов, 8 минут, 28 секунд (25.06.2012 - 09:16) Placido написал(а):
Для работы с датой и временем есть целый класс DateTime (PHP 5 >= 5.2.0)
$str = '24.06.2012 23:00';
$datetime = new DateTime($str);
echo 'Год: ' . $datetime->format('Y') . '<br/>';
echo 'Месяц: ' . $datetime->format('m') . '<br/>';
echo 'День: ' . $datetime->format('d') . '<br/>';
echo 'Время: ' . $datetime->format('H:i') . '<br/>';
//Год: 2012
//Месяц: 06
//День: 24
//Время: 23:00

Если формат нестандартный, то так (PHP 5 >= 5.3.0):
$str = '06.24.2012 {23-00}';
$datetime = DateTime::createFromFormat('m.d.Y {H-i}', $str);
echo 'Год: ' . $datetime->format('Y') . '<br/>';
echo 'Месяц: ' . $datetime->format('m') . '<br/>';
echo 'День: ' . $datetime->format('d') . '<br/>';
echo 'Время: ' . $datetime->format('H:i') . '<br/>';
//Год: 2012
//Месяц: 06
//День: 24
//Время: 23:00

Спустя 53 минуты, 38 секунд (25.06.2012 - 10:10) iVasya написал(а):
А может, есть готовая функция для перевода строки с датой в timestamp?
Мне это разбиение строки нужно только для того, что бы на выходе метку timestamp получить:)
Или только вручную, разбивать строку, приводить к int, переводить все в секунды и складывать?
Если нет, то придется возиться с тем, что в месяцах разное кол-во дней, да и год бывает высокосным.

Спустя 37 минут, 11 секунд (25.06.2012 - 10:47) Placido написал(а):
Откройте для себя класс DateTime.
echo DateTime::createFromFormat('d.m.Y H:i', '24.06.2012 23:00')->getTimestamp();
//1340568000

//Процедурный стиль:

echo date_timestamp_get(date_create_from_format('d.m.Y H:i', '24.06.2012 23:00'));
//1340568000

Спустя 13 минут, 2 секунды (25.06.2012 - 11:00) iVasya написал(а):
А если мне сервер говорит

Call to undefined method DateTime::createFromFormat()
и
Call to undefined function date_timestamp_get()

Это проблемы с настройками php.ini, или из-за чего это может быть?

Спустя 3 минуты, 28 секунд (25.06.2012 - 11:03) Placido написал(а):
Из-за того, что версия PHP < 5.3.

Спустя 11 минут, 1 секунда (25.06.2012 - 11:14) iVasya написал(а):
Ок, спасибо smile.gif
И последнее, не совсем в тему, но все же.
Какой из способов, процедурный или метод классы DateTime более быстрый, или корректный, если так можно сказать? Или они абсолютно идентичны?

Кстати, в мануале пишут, что этот класс для (PHP 5 >= 5.2.0) (http://www.php.net/manual/ru/class.datetime.php)
а у меня 5.2.9
А нет, пардон, увидел)
А для версии < 5.3 аналогов нету, не знаете?

Спустя 15 минут, 16 секунд (25.06.2012 - 11:30) Placido написал(а):
Оба способа корректные, это вопрос личных предпочтений. Мне лично ООП-стиль кажется более наглядным.

Спустя 57 минут, 2 секунды (25.06.2012 - 12:27) killer8080 написал(а):
Цитата (iVasya @ 25.06.2012 - 10:10)
Мне это разбиение строки нужно только для того, что бы на выходе метку timestamp получить:)

для старых версий PHP можно так
$str = '24.06.2012 23:00'; 
$time = strtotime(preg_replace('#^(\d+)\.(\d+)\.(\d+) (\d+:\d+(:\d+)?)$#', '\\3-\\2-\\1 \\4', $str));




Спустя 44 минуты, 14 секунд killer8080 написал(а):
или так
$time = strtotime(str_replace('.', '-', $str));

Спустя 4 часа, 59 минут, 9 секунд (25.06.2012 - 17:26) Invis1ble написал(а):
killer8080
str_replace там вроде не нужен, и так должно работать
$timestamp = strtotime('24.06.2012 23:00');

Спустя 15 часов, 39 минут, 21 секунда (26.06.2012 - 09:05) killer8080 написал(а):
Invis1ble
точно, работает smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.