¿Strptime() equivalente en Windows?

Resuelto An̲̳̳drew asked hace 15 años • 8 respuestas

¿Existe una buena implementación equivalente strptime()disponible para Windows? Lamentablemente, esta función POSIX no parece estar disponible.

Descripción del grupo abierto de strptime - resumen: convierte una cadena de texto como "MM-DD-YYYY HH:MM:SS"en un tm struct, lo opuesto a strftime().

An̲̳̳drew avatar Nov 27 '08 02:11 An̲̳̳drew
Aceptado

Si no desea portar ningún código o condenar el impulso de su proyecto, puede hacer esto:

  1. analizar la fecha usandosscanf
  2. luego copie los números enteros en a struct tm(resta 1 del mes y 1900 del año; los meses son del 0 al 11 y los años comienzan en 1900)
  3. finalmente, utilícelo mktimepara obtener un número entero de época UTC

Solo recuerde configurar el isdstmiembro del struct tmen -1, o de lo contrario tendrá problemas con el horario de verano.

amwinter avatar Jun 29 '2010 03:06 amwinter

Suponiendo que esté utilizando Visual Studio 2015 o superior, puede utilizar esto como reemplazo directo de 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());
}

Solo tenga en cuenta que, para aplicaciones multiplataforma, std::get_timeno se implementó hasta GCC 5.1, por lo que cambiar a llamadas std::get_timedirectas puede no ser una opción.

Orvid King avatar Nov 05 '2015 10:11 Orvid King

Esto hace el trabajo:

#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 );

Tenga en cuenta, sin embargo, que la cadena de entrada es AAAA-MM-DD

ravenspoint avatar Nov 26 '2008 19:11 ravenspoint