Ошибка формата PHP strptime? - PullRequest
       25

Ошибка формата PHP strptime?

2 голосов
/ 31 октября 2008

Я борюсь с проблемой PHP 5.2.6. API, который мы используем, возвращает даты в этом формате DDMMYYYYHHMM. Именно этот формат, фиксированная длина, без разделителей. Тем не менее, в моих экспериментах, этот формат, кажется, нарушает strptime, который возвращает ложь (сбой), когда я передаю ему дату в этом формате. Это может быть воспроизведено, по крайней мере на моей системе, с этим примером:

$format = "%d%m%Y%H%M"; echo print_r(strptime(strftime($format,1225405967),$format),true);

Если я добавлю какой-либо символ между датой и временем, это сработает, даже пробел. Итак, это работает:

$format = "%d%m%Y %H%M"; echo print_r(strptime(strftime($format,1225405967),$format),true);

Я что-то упускаю из виду?

edit: в дополнение к этому и благодаря результатам, указанным в комментариях, это, похоже, зависит от платформы. Я могу воспроизвести его на компьютерах Mac, работающих под управлением OSX Leopard, в офисе, но Linux-блоки разбирают его отлично. Я предполагаю, что это ошибка или идиосинкразия strptime в базовой библиотеке C в * nix OSX.

Ответы [ 5 ]

1 голос
/ 02 ноября 2008

Если вы думаете, что проблема в MacOS X и в библиотеке C, то вы можете создать тестовый пример, чтобы продемонстрировать это. Например, я запустил приведенный ниже код на MacOS X 10.4.11 (PPC, G4, 32-разрядный) и получил вывод:

Now: 1225573977
Formatted (12): 011120082112
End: 0xBFFFF553 (Buffer: 0xBFFFF547)
Then: year = 2008, month = 11, day = 1, hour = 21, minute = 12
Reformatted (12): 011120082112

Код, который я использовал:

#include <time.h>
#include <stdio.h>

int main(void)
{
    time_t now = time(0);
    struct tm *tm = gmtime(&now);
    char format[] = "%d%m%Y%H%M";
    char buffer1[64];
    char buffer2[64];
    size_t f_len = strftime(buffer1, sizeof(buffer1), format, tm);
    struct tm then;
    char *end = strptime(buffer1, format, &then);
    size_t p_len = strftime(buffer2, sizeof(buffer2), format, &then);

    printf("Now: %ld\n", (long)now);
    printf("Formatted (%lu): %s\n", (unsigned long)f_len, buffer1);
    printf("End: 0x%08lX (Buffer: 0x%08lX)\n", (unsigned long)end, (unsigned long)buffer1);
    printf("Then: year = %d, month = %d, day = %d, hour = %d, minute = %d\n",
            then.tm_year + 1900, then.tm_mon + 1, then.tm_mday, then.tm_hour, then.tm_min);
    printf("Reformatted (%lu): %s\n", (unsigned long)p_len, buffer2);

    return(0);
}

Исходя из того, что я вижу, в strptime () в используемой версии ошибки нет. Мы можем спорить о достоинствах несуществующей проверки ошибок и о приведениях к нотациям C99 <inttypes.h> в печати, но я думаю, что код достаточно точен. Я использовал gmtime() вместо localtime(); Я сомневаюсь, что это было фактором, который не воспроизводил проблему.

Может быть, вам стоит взглянуть на набор тестов PHP? Может быть, вам следует разбить свое довольно сложное выражение на части, чтобы определить, где происходит ошибка в PHP?

1 голос
/ 01 ноября 2008

Эта функция зависит от локали. Вы пробовали установить другую локаль? (см. setlocale())

0 голосов
/ 17 августа 2011

Подтверждаю:

    $p = strptime("09.02.2002", "%d.%m.%Y");
    var_dump($p);

Выход:

массив (9) { [ "Tm_sec"] => Int (0) [ "Tm_min"] => Int (0) [ "Tm_hour"] => Int (0) [ "Tm_mday"] => INT (9) [ "Tm_mon"] => INT (1) [ "Tm_year"] => INT (102) [ "Tm_wday"] => Int (0) [ "Tm_yday"] => Int (0) [ "Неанализируемые"] => строка (0) "" }

OS X Leopard, PHP 5.3.2

0 голосов
/ 01 ноября 2008

Весьма вероятно, что он изолирован только для Mac, так как он еще даже не был реализован в Windows (хотя я принял это предложение).

5.2.6
Fatal error: Call to undefined function strptime() in F:\htdocs\strptime.php on line 5

Я бы отправил сообщение об ошибке на bugs.php.net .

0 голосов
/ 31 октября 2008

Ничего очевидного, поскольку обе версии прекрасно работают в PHP 5.2.0. Я не могу с готовностью проверить 5.2.6 в настоящее время, хотя. Это должно подождать, пока я не вернусь домой.

...