The '%z' format character isn't functional. Try the following: #define _XOPEN_SOURCE #define _BSD_SOURCE #include <time.h> #include <stdio.h> int main(void) { struct tm tm; strptime("1113472456 +1000", "%s %z", &tm); if (tm.tm_gmtoff == 36000) { printf("OK"); return 0; } else { printf("Error: tm_gmtoff is %ld\n", tm.tm_gmtoff); return 1; } } The man page states that "In most cases the corresponding fields are parsed, but no field in tm is changed.". I assume that in the case of at least %F and %z, the field in tm _should_ be changed.
%z has never been implemented, so I'd say this is mainly a documentation bug that documents a GNU extension that never existed. You can see that strptime returns NULL, i.e. an error. Unlike %z, %Z does not cause a failure, but is simply ignored. %z perhaps could be implemented, but %Z would be much harder.
I fixed this in upstream glibc.
%z has been implemented in CVS glibc, should appear in glibc-2.3.5-3 and above.