strptime() equivalent on Windows?
If you don't want to port any code or condemn your project to boost, you can do this:
- parse the date using
sscanf
- 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) - 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);