2008-10-31 4 views
2

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

$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); 

Я пропустил что-то очевидное?

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

+0

Какая платформа вы используете? Я попробовал ваш пример на PHP 5.2.6 (cli) Linux Kernel 2.6.9-55 и имел два выхода массивов, которые выглядели точно так же. – Brian

+0

Моя платформа для разработчиков - OSX Leopard и Apache2. Интересные результаты, спасибо за ответ. – user33150

+0

Это выглядит все больше платформы. Я могу заставить его работать (оба примера) на другом сервере, запускающем еще один дистрибутив Linux. Я продолжу поиск известных ошибок в strptime в библиотеке C, поставляемой с Mac OSX. Кажется, в этом моя проблема. – user33150

ответ

0

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

+0

Tnanks для ответа. Кажется, это специфичная для платформы. Моя Dev-платформа OSX Leopard и strptime в базовой библиотеке C, похоже, является виновником. Я не могу воспроизвести его на Linux-боксах, но оба компьютера Mac в офисе показывают одинаковое поведение. – user33150

1

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

0

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

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

Я бы идти вперед и представить ошибку в bugs.php.net.

1

Если вы считаете, что проблема заключается в MacOS X и в библиотеке C, вы можете создать тестовый пример, чтобы продемонстрировать его. Например, я побежал код ниже на MacOS X 10.4.11 (КПП, 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?

0

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

$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

 Смежные вопросы

  • Нет связанных вопросов^_^