Дополнительное пространство добавляется в массив - PullRequest
0 голосов
/ 02 апреля 2012

Мой веб-сервис XML отправляет дополнительный пробел в параметре datetime массива.До 1 апреля формат передавался как:

Sun Mar 31 02:05:49 2012 GMT

... но с 1 апреля он переформатировался как:

Sun Apr  1 02:05:49 2012 GMT (Note the extra space between "Apr" and "1")

Проблема в том, что я 'Я взрываю массив с пробелом (" "), чтобы взять [Месяц] + [Дата] + [Год] , но теперь я получаю [Месяц] + [пусто] + [Отметка] .

Есть ли функция массива для обратного отсчета, поэтому я получаю [часовой пояс] [год] [отметка времени] [дата] и т. Д. * 10101 *

Спасибо.

Ответы [ 5 ]

1 голос
/ 02 апреля 2012

Как подсказывает Алекс Ховански, вы должны использовать некоторую функцию разбора даты / времени. Затем вы можете использовать date () или DateTime :: format () для вывода даты в нужном формате:

$formatA = 'Sat Mar 31 02:05:49 2012 GMT';
$formatB = 'Sun Apr  1 02:05:49 2012 GMT';

var_dump(
    new DateTime( $formatA ),
    new DateTime( $formatB ),
    date( 'Y-m-d H:i:s', strtotime( $formatA ) ),
    date( 'Y-m-d H:i:s', strtotime( $formatB ) )
);

Выход:

object(DateTime)#1 (3) {
    ["date"]=>
        string(19) "2012-03-31 02:05:49"
    ["timezone_type"]=>
        int(2)
    ["timezone"]=>
        string(3) "GMT"
}

object(DateTime)#2 (3) {
    ["date"]=>
        string(19) "2012-04-01 02:05:49"
    ["timezone_type"]=>
        int(2)
    ["timezone"]=>
        string(3) "GMT"
}

string(19) "2012-03-31 04:05:49"

string(19) "2012-04-01 04:05:49"
1 голос
/ 02 апреля 2012

Если вы хотите проанализировать дату, используйте strtotime:

$time = 'Sun Apr  1 02:05:49 2012 GMT';

$month = date('M', $ts); // Apr
$day = date('j', $ts);   // 1
$year = date('Y', $ts);  // 2012

Это также обеспечивает преобразование времени в ваш текущий часовой пояс, который вы можете изменить следующим образом:

date_default_timezone_set('GMT');

Другой альтернативой является простое использование strptime, которое фактически было создано для дат анализа , но не учитывает временные зоны:

$parsed = strptime($time, '%c');
1 голос
/ 02 апреля 2012

Почему бы просто не использовать strtotime() для всей строки?

1 голос
/ 02 апреля 2012

Вы можете разделить, используя регулярное выражение

$array = preg_split('/[\s]+/', $date);

Это будет использовать один или несколько пробелов в качестве разделителя

0 голосов
/ 02 апреля 2012

Вы можете использовать array_filter(), чтобы удалить все записи массива, которые оцениваются в FALSE. Смотри: http://php.net/manual/en/function.array-filter.php

Хотя, должен заметить, я бы, наверное, сам использовал решение Дархазера. Просто упомяну здесь array_filter (), так как я не уверен, каковы издержки при использовании preg_split() по сравнению с array_filter().

...