2012-06-14 8 views
0

Je suis prêt à demander si quelqu'un a un bon algorithme (ou moyens) pour vérifier si deux variable SYSTEMTIME a un diff de 30 jours ou plus?30 jours Différence sur SYSTEMTIME

Merci

+1

@Flimzy Je suppose que l'autre? – Anthony

+3

Je convertirais probablement tous les deux en FILETIME et les comparerais ainsi. Vous utiliseriez la fonction SystemTimeToFileTime pour le faire, puis faites juste le calcul. –

Répondre

5

Je convert them to FileTime et soustrayez les uns des autres.
La différence doit être supérieure à 30*24*60*60*10^7.

+0

Merci, mais pouvez-vous s'il vous plaît prendre une seconde pour expliquer le numéro '30 * 24 * 60 * 60 * 10^7' un peu? Je veux juste m'assurer que personne ne se trompe. –

+0

@AllanJiang Il s'agit du nombre d'intervalles de 100 nanosecondes en 30 jours. ['FileTime'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724284.aspx) a une résolution de 100 nanosecondes, comme vous pouvez le découvrir en cliquant sur le lien. – GSerg

+1

Je ferais très attention à utiliser^dans des langages basés sur C car c'est un xor logique, plutôt qu'une opération d'exposant! – Owl

6

Comme le MSDN page sur SYSTEMTIME dit,

Il est déconseillé d'ajouter et de supprimer des valeurs dans la structure SYSTEMTIME pour obtenir des temps relatifs. Au lieu de cela, vous devez

  • Convertir la structure SYSTEMTIME à une structure FILETIME.
  • Copiez la structure FILETIME résultante dans une structure ULARGE_INTEGER.
  • Utilisez l'arithmétique 64 bits normale sur la valeur ULARGE_INTEGER.
SYSTEMTIME st1, st2; 
/* ... */ 
FILETIME ft1, ft2; 
ULARGE_INTEGER t1, t2; 
ULONGLONG diff; 
SystemTimeToFileTime(&st1, &ft1); 
SystemTimeToFileTime(&st2, &ft2); 
memcpy(&t1, &ft1, sizeof(t1)); 
memcpy(&t2, &ft2, sizeof(t1)); 
diff = (t1.QuadPart<t2.QuadPart)?(t2.QuadPart-t1.QuadPart):(t1.QuadPart-t2.QuadPart); 
if(diff>(30*24*60*60)*10000000) 
{ 
    ... 
} 

(erreur de manipulation sur les appels à SystemTimeToFileTime omis par souci de concision)

A propos du (30*24*60*60)*10000000: 30*24*60*60 est le nombre de secondes dans les 30 jours; 10000000 est le nombre de FILETIME "ticks" dans une seconde (chaque tick FILETIME est 100 ns = 10^2 * 10^-9 s = 10^-7 s).

Questions connexes