Если вы думаете, что проблема в 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?