2009-07-28 9 views

Répondre

0

Cela dépend du système d'exploitation, utilisons-nous Windows ou quelque chose de compatible POSIX ici?

+0

Je veux qu'il soit aussi standard que possible –

+0

il y a une différence fondamentale dans les fenêtres de manière magasins c'est dates et le reste de la monde. C'est l'une de ces choses qui est seulement répondu par la documentation du système d'exploitation. Voir http://en.wikipedia.org/wiki/System_date – ewanm89

+0

disons que c'est pour un système compatible POSIX –

6

Utilisez la fonction localtime. Passez les valeurs de 0 à numeric_limits<time_t>::max(). Pour les valeurs inacceptables, cette fonction retournera un pointeur nul. Vous pouvez utiliser l'algorithme de recherche binaire pour trouver la valeur appropriée plus rapidement: O (log N) où N = numeric_limits<time_t>::max().

L'exemple suivant utilise la bibliothèque boost, mais elle est toujours indépendante de la plate-forme. Vous pouvez implémenter le même sans STL ou boost si nécessaire.

#include <iostream> 
#include <time.h> 
#include <limits> 
#include <algorithm> 
#include <boost/iterator/counting_iterator.hpp> 

using namespace std; 
using namespace boost; 

bool less_time(time_t val1, time_t val2) 
{ 
    tm* v1 = localtime(&val1); 
    tm* v2 = localtime(&val2); 
    if (v1 && v2) return false; 
    if (!v1 && !v2) return false; 
    if (v1 && !v2) return true; 
    return false; 
}; 

int main() { 
    counting_iterator<time_t> x = upper_bound(counting_iterator<time_t>(0), counting_iterator<time_t>(numeric_limits<time_t>::max()), 0, less_time); 
    time_t xx = *x; 
    --xx; // upper_bound gives first invalid value so we use previous one 
    cout << "Max allowed time is: " << ctime(&xx) << endl; 

    return 0; 
}
Questions connexes