strptime() equivalent on Windows? strptime() equivalent on Windows? windows windows

strptime() equivalent on Windows?


If you don't want to port any code or condemn your project to boost, you can do this:

  1. parse the date using sscanf
  2. then copy the integers into a struct tm (subtract 1 from month and 1900 from year -- months are 0-11 and years start in 1900)
  3. finally, use mktime to get a UTC epoch integer

Just remember to set the isdst member of the struct tm to -1, or else you'll have daylight savings issues.


Assuming you are using Visual Studio 2015 or above, you can use this as a drop-in replacement for strptime:

#include <time.h>#include <iomanip>#include <sstream>extern "C" char* strptime(const char* s,                          const char* f,                          struct tm* tm) {  // Isn't the C++ standard lib nice? std::get_time is defined such that its  // format parameters are the exact same as strptime. Of course, we have to  // create a string stream first, and imbue it with the current C locale, and  // we also have to make sure we return the right things if it fails, or  // if it succeeds, but this is still far simpler an implementation than any  // of the versions in any of the C standard libraries.  std::istringstream input(s);  input.imbue(std::locale(setlocale(LC_ALL, nullptr)));  input >> std::get_time(tm, f);  if (input.fail()) {    return nullptr;  }  return (char*)(s + input.tellg());}

Just be aware that for cross platform applications, std::get_time wasn't implemented until GCC 5.1, so switching to calling std::get_time directly may not be an option.


An open-source version (BSD license) of strptime() can be found here: http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/time/strptime.c?rev=HEAD

You'll need to add the following declaration to use it:

char *strptime(const char * __restrict, const char * __restrict, struct tm * __restrict);