+#ifdef HAVE_STRPTIME
+
+// glibc2 doesn't define this in the headers unless _XOPEN_SOURCE is defined
+// which, unfortunately, wreaks havoc elsewhere
+#if defined(__GLIBC__) && (__GLIBC__ == 2)
+ extern "C" char *strptime(const char *, const char *, struct tm *);
+#endif
+
+// Unicode-friendly strptime() wrapper
+static const wxChar *
+CallStrptime(const wxChar *input, const char *fmt, tm *tm)
+{
+ // the problem here is that strptime() returns pointer into the string we
+ // passed to it while we're really interested in the pointer into the
+ // original, Unicode, string so we try to transform the pointer back
+#if wxUSE_UNICODE
+ wxCharBuffer inputMB(wxConvertWX2MB(input));
+#else // ASCII
+ const char * const inputMB = input;
+#endif // Unicode/Ascii
+
+ const char *result = strptime(inputMB, fmt, tm);
+ if ( !result )
+ return NULL;
+
+#if wxUSE_UNICODE
+ // FIXME: this is wrong in presence of surrogates &c
+ return input + (result - inputMB.data());
+#else // ASCII
+ return result;
+#endif // Unicode/Ascii
+}
+
+#endif // HAVE_STRPTIME
+