web-dev-qa-db-fra.com

Convertir une chaîne en date en C++

Je sais que cela peut être simple mais étant C++, je doute que ce le sera. Comment convertir une chaîne de forme 01/01/2008 en date afin de pouvoir la manipuler? Je suis heureux de casser la corde aux électeurs jour mois année. Aussi heureux si la solution est uniquement Windows.

18
Ubervan
#include <time.h>
char *strptime(const char *buf, const char *format, struct tm *tm);
15
kenny

Je l'ai compris sans utiliser strptime.

Décomposez la date en ses composantes, à savoir jour, mois, année, puis:

struct tm  tm;
time_t rawtime;
time ( &rawtime );
tm = *localtime ( &rawtime );
tm.tm_year = year - 1900;
tm.tm_mon = month - 1;
tm.tm_mday = day;
mktime(&tm);

tm peut maintenant être converti en un time_t et être manipulé.

9
Ubervan

Vous pouvez essayer Boost.Date_Time Input/Output .

6
Ferruccio

Pour tous ceux qui recherchent strptime() pour Windows, la source de la fonction elle-même est nécessaire pour fonctionner. Le dernier code NetBSD ne porte malheureusement pas facilement à Windows, malheureusement.

J'ai moi-même utilisé l'implémentationici(strptime.h et strptime.c).

Un autre morceau de code utile peut être trouvéici. Cela vient à l'origine de Google Codesearch, qui n'existe plus.

J'espère que cela économise beaucoup de recherche, car il m'a fallu un bon bout de temps pour le trouver (et aboutissait le plus souvent à cette question).

2
DoubleYou
#include <time.h>
#include <iostream>
#include <sstream>
#include <algorithm>

using namespace std;

int main ()
{
  time_t rawtime;
  struct tm * timeinfo;
  int year, month ,day;
  char str[256];

  cout << "Inter date: " << endl; 
  cin.getline(str,sizeof(str));

  replace( str, str+strlen(str), '/', ' ' );  
  istringstream( str ) >> day >> month >> year;

  time ( &rawtime );
  timeinfo = localtime ( &rawtime );
  timeinfo->tm_year = year - 1900;
  timeinfo->tm_mon = month - 1;
  timeinfo->tm_mday = day;
  mktime ( timeinfo );

  strftime ( str, sizeof(str), "%A", timeinfo );
  cout << str << endl;
  system("pause");
  return 0;
}
1

Pourquoi ne pas opter pour une solution plus simple en utilisant boost

using namespace boost::gregorian;
using namespace boost::posix_time;    
ptime pt = time_from_string("20150917");
1
Johan Engblom

La bibliothèque POCO a une classe DateTimeParser qui pourrait vous aider avec cela. http://www.appinf.com/docs/poco/Poco.DateTimeParser.html

1
Adrian Kosmaczewski

Vous pouvez utiliser la librairie boost (multiplateforme)

#include <stdio.h>
#include "boost/date_time/posix_time/posix_time.hpp"

int main()
{    
std::string strTime = "2007-04-11 06:18:29.000";
std::tm tmTime = boost::posix_time::to_tm(boost::posix_time::time_from_string(strTime));
return 0;
}

Mais le format devrait être comme mentionné :)

0
Vinoj John Hosan