Prównywanie dat

0

mam datę w postaci:
int dzien, int miesiac, int rok,

i chciałbym sprawdzić czy mieści się ona w jakimś przedziale zapisanym w tej samej postaci... ifami to mało efektywnie działa;
Czy istnieje funkcja, która rozwiązałaby mój problem? A jak nie to jak to zrobić, żeby działało?
Program musi być w ANSI C.

0

Zamień wszystkie (min,max,data) daty na pojedyncze liczby np. zcastowane FILETIME na int64 i porównuj standardowymi operatorami:

if (data < min) ZaStaraData();
else if (data > min) ZaNowaData();
else DataWZakresie();

Wadą FILETIME jest wysoka rozdzielczość i to, że najniższy rok to 1601, ale zawsze można przyjąć jeden dzień za jednostkę daty, a ilość dni od roku 0 można łatwo obliczyć.

0

Hmmm chodzi o daty zbliżone do naszych:P

ALe szczerze mówiąc nie bardzo rozumiem tego FILETIME... mieści się to w standardzie ANSI C? Jak tego użyć:P?

0
#include <stdio.h>
#include <stdlib.h>

// Upakuj datę do jednej liczby w kolejności rok , miesiąc , dzień
// za pomocą przesunięć bitowych 
// Otrzymasz liczbę - im większa data tym większa liczba
//

unsigned int fun( unsigned int rok , unsigned int miesiac , unsigned int dzien)
{
    unsigned int temp = rok ;
    temp <<= 4 ;                        // miejsce - 4 bity na miesiąc
    temp = temp + miesiac ;
    temp <<= 8 ;                        // 8 bitów na dzień  ale wystarczy 5 ( temp <<= 5 ; )
    temp = temp + dzien ;
    return temp ;
}


//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char **argv)
{

      unsigned int moja_data = fun(1988,1,14);

      if( (moja_data <= fun(2008,11,14) )&&( moja_data >= fun(1987,3,22) )  )
      {
         printf("Data w zakresie.\n") ;

      }else{
              printf("Data poza zakresem.\n") ;
            }

      getchar();
        return 0;
}

:-)

0

Szkoda, że uporałem sobie z tym problemem if'ami, bo Twój sposób jest rewelacyjny... Sam chciałem to na stringa przerobić, a wtedy zwykłym strcmp...ale na to nie wpadłem... big thx za pomoc:-)

0

Proponuję małe usprawnienie. Sumowanie bitowe, zamiast normalnego.

inline unsigned int fun(const unsigned int rok, const unsigned int miesiac, const unsigned int dzien)
{
	return (((rok << 4) | miesiac) << 8) | dzien;
}
0

I super , modyfikacja .
Tylko parametry fun nie muszą być deklarowany jako 'const' .
Const oznacza że parametr nie będzie modyfikowany , ale to szczegół .
Parametry przekazywane przez wartość są kopiowane na stos ( ich wartość ),
const czy nie const nie ma żadnego wpływu w tym przypadku.
Co innego wskaźniki lub referencje .
Pozdro :-)

PS ,
Funkcja będzie działać prawidłowo dla int == 4 bajty , dla kompilatorów 16 bitowych trzeba
odpowiednio zmodyfikować typy pobierane przez fun ponieważ tam 'int' ma rozmiar 2 bajtów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1