web-dev-qa-db-fra.com

strptime () équivalent sur Windows?

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().

38
An̲̳̳drew

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);
17
Adam Rosenfield

Si vous ne voulez pas porter de code ou condamner votre projet à booster, vous pouvez le faire:

  1. analyser la date en utilisant sscanf
  2. puis copiez les entiers dans un struct tm (soustrayez 1 du mois et 1900 de l'année - les mois sont 0-11 et les années commencent en 1900)
  3. enfin, utilisez mktime pour obtenir un entier UTC Epoch

N'oubliez pas de définir le membre isdst du struct tm à -1, sinon vous aurez des problèmes d'heure d'été.

30
amwinter

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.

16
Orvid King

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

13
ravenspoint