2011-01-24 4 views
3

J'ai un resultset (à partir d'une fonction) qui est basé sur le temps. Mais la valeur datetime est au format chaîne (par exemple "21: 5 Jan 23, 11"). Je veux convertir "21: 5 Jan 23, 11" à datetime. Comment puis-je faire cela en C++? Je veux juste filtrer les enregistrements pour aujourd'hui. Donc, j'ai besoin de récupérer la date actuelle de "21: 5 23 janvier, 11".Comment convertir une chaîne en datetime en C++

Edit:

Je peux obtenir la date et l'heure à l'aide SYSTEMTIME st; GetSystemTime (& st);

Y at-il un moyen de convertir "21: 5 Jan 23, 11" dans le format ci-dessus?

Répondre

0

Si tout ce que vous avez besoin est de vérifier si deux chaînes ont la même date ou non et s'il est garanti que les chaînes sont dans le même format , alors il n'y a pas besoin de le convertir à l'heure de la date. Il suffit de comparer les sous-chaînes après le premier espace. Si elles sont identiques, alors les dates sont les mêmes. Voici l'exemple de code:

using namespace std; 

string getCurrentDate() 
{ 
    //Enumeration of the months in the year 
    const char* months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; 

    //Get the current system date time 
    SYSTEMTIME st; 
    GetSystemTime(&st); 

    //Construct the string in the format "21:5 Jan 23, 11" 
    ostringstream ss; 
    ss<<st.wHour<<":"<<st.wMinute<< 
     " "<<months[st.wMonth-1]<< 
     " "<<st.wDay<<", "<<st.wYear%1000; 

    //Extract the string from the stream 
    return ss.str(); 

} 

string getDateString(const string& s) 
{ 
    //Extract the date part from the string "21:5 Jan 23, 11" 

    //Look for the first space character in the string 
    string date; 
    size_t indx = s.find_first_of(' '); 
    if(indx != string::npos) //If found 
    { 
     //Copy the date part 
     date = s.substr(indx + 1); 
    } 
    return date; 
} 
bool isCurrentDate(const string& s1) 
{ 
    //Get the date part from the passed string 
    string d1 = getDateString(s1); 

    //Get the date part from the current date 
    string d2 = getDateString(getCurrentDate()); 

    //Check whether they match 
    return ! d1.empty() && ! d2.empty() && d1 == d2; 
} 

int main(void) 
{ 
    bool s = isCurrentDate("21:5 Jan 23, 11"); 
    bool s1 = isCurrentDate("21:5 Jan 25, 11"); 
    return 0; 
} 
+1

bonne suggestion, (et de meilleures performances que la conversion de toutes les chaînes à la date/heure), mais devrait aussi ajouter qu'il doit convertir le 'date' courant en chaîne dans le même format pour comparer – davka

+0

Merci Asha pour la réponse. Mais j'ai besoin de comparer "21: 5 23 janvier, 11" avec la date actuelle. Je pense que la date et l'heure actuelles seront toujours en millisecondes. Comment puis-je comparer? – sid

+0

@Subrat: Voir le code mis à jour pour obtenir la date actuelle. – Asha

1

La façon C++ le plus général est d'utiliser Boost.DateTime.

+1

Bien que ce soit un moyen simple de le faire, il ne donne pas vraiment un aperçu réel du processus et il est toujours possible qu'il n'y ait pas accès. – Tango

6
#include <ctime> 
#include <iomanip> 
#include <iostream> 
#include <sstream> 

// Converts UTC time string to a time_t value. 
std::time_t getEpochTime(const std::wstring& dateTime) 
{ 
    // Let's consider we are getting all the input in 
    // this format: '2014-07-25T20:17:22Z' (T denotes 
    // start of Time part, Z denotes UTC zone). 
    // A better approach would be to pass in the format as well. 
    static const std::wstring dateTimeFormat{ L"%Y-%m-%dT%H:%M:%SZ" }; 

    // Create a stream which we will use to parse the string, 
    // which we provide to constructor of stream to fill the buffer. 
    std::wistringstream ss{ dateTime }; 

    // Create a tm object to store the parsed date and time. 
    std::tm dt; 

    // Now we read from buffer using get_time manipulator 
    // and formatting the input appropriately. 
    ss >> std::get_time(&dt, dateTimeFormat.c_str()); 

    // Convert the tm structure to time_t value and return. 
    return std::mktime(&dt); 
} 
Questions connexes