Existe-t-il une bonne implémentation équivalente de strptime()
disponible pour Windows? Malheureusement, cette fonction POSIX ne semble pas être disponible.
Description du groupe ouvert de strptime - résumé: il convertit une chaîne de texte telle que "MM-DD-YYYY HH:MM:SS"
En un tm struct
, L'opposé de strftime()
.
Une version open source (licence BSD) de strptime()
peut être trouvée ici: http://cvsweb.netbsd.org/bsdweb.cgi/src/lib /libc/time/strptime.c?rev=HEAD
Vous devrez ajouter la déclaration suivante pour l'utiliser:
char *strptime(const char * __restrict, const char * __restrict, struct tm * __restrict);
Si vous ne voulez pas porter de code ou condamner votre projet à booster, vous pouvez le faire:
sscanf
struct tm
(soustrayez 1 du mois et 1900 de l'année - les mois sont 0-11 et les années commencent en 1900)mktime
pour obtenir un entier UTC EpochN'oubliez pas de définir le membre isdst
du struct tm
à -1, sinon vous aurez des problèmes d'heure d'été.
En supposant que vous utilisez Visual Studio 2015 ou supérieur, vous pouvez l'utiliser comme remplacement de remplacement pour 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());
}
Sachez simplement que pour les applications multiplates-formes, std::get_time
n'a pas été implémenté avant GCC 5.1, donc passer à l'appel std::get_time
directement peut ne pas être une option.
Cela fait le travail:
#include "stdafx.h"
#include "boost/date_time/posix_time/posix_time.hpp"
using namespace boost::posix_time;
int _tmain(int argc, _TCHAR* argv[])
{
std::string ts("2002-01-20 23:59:59.000");
ptime t(time_from_string(ts));
tm pt_tm = to_tm( t );
Notez, cependant, que la chaîne d'entrée est AAAA-MM-JJ