« Biblioteka <time.h>, lekcja »
Dokument opisuje jak korzystać z biblioteki do obsługi czasu. (lekcja)
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!
Autor: Piotr Szawdyński
Kurs C++

Biblioteka <time.h>

[lekcja] Dokument opisuje jak korzystać z biblioteki do obsługi czasu.

1. Biblioteka do obsługi czasu

Jeśli chcemy odczytać aktualny czas na swoim komputerze, policzyć różnicę czasu lub skorzystać z innych operacji związanych z czasem musimy skorzystać w tym celu z biblioteki time.h. Funkcje są proste w użyciu, jednak wymagana jest tu już znajomość rozdziału poświęconego wskaźnikom.

2. Wstęp

Biblioteka do obsługi czasu udostępnia nam kilka typów danych do których możemy odczytywać czas i wykonywać proste operacje na czasie, takie jak dodawanie czy odejmowanie.

2.1. Typ danych: time_t

Pierwszym typem danych jest time_t. Jest to liczba prosta, całkowita (np. long). W zależności od kompilatora i środowiska może mieć ona różny rozmiar, zazwyczaj są to 4 bajty.
time_t Zmienna_Do_Czasu;

2.2. Typ danych: struct tm

Drugim typem danych jest struct tm lub też poprostu tm. W języku C, aby używać typów danych strukturalnych należało poprzedzać je słowem kluczowym struct. Programiści C++ bardzo często nie piszą słowa kluczowego struct, ponieważ standard języka C++ został usprawniony w stosunku do swojego poprzednika C i nie jest to słowo kluczowe wymagane do tego, aby używać typów strukturalnych. Poniżej przedstawiam opis pól struktury tm.
C/C++
struct tm
{
    int tm_sec; //Sekundy. Zakres [0..61]
    int tm_min; //Minuty. Zakres [0..59]
    int tm_hour; //Godziny. Zakres [0..23]
    int tm_mday; //Dzień miesiąca. Zakres [1..31]
    int tm_mon; //Miesiąc. Zakres [0..11]
    int tm_year; //Obecny rok. Lata zaczynają się liczyć od roku 1900, czyli: wartość 0 = 1900 rok.
    int tm_wday; //Dzień tygodnia. Zakres [0..6]. 0 = Niedziela; 1 = Poniedziałek; itd...
    int tm_yday; //Dzień roku. Zakres [0..365].
    int tm_isdst; //Letnie/zimowe przesunięcie czasowe. Jeśli wartość jest większa od 0 to przesunięcie czasowe jest 'aktywne'. Jeśli wartość mniejsza od 0 to informacja jest niedostępna.
}


3. Podstawowe funkcje obsługi czasu

O paragrafie
Paragraf ten został opracowany przez użytkownika Patzick.

Aby dobrze zrozumieć i móc korzystać z możliwości obsługi czasu trzeba poznać funkcje, które udostępnia nam biblioteka <time.h>
  • asctime – konwertuje datę na jej słowną wersję

    Składnia wygląda tak:
    char * asctime( const struct tm * ptr );


    Funkcja zwraca dane w następującym porządku:
    dzień(słownie) miesiąc(słownie) dzień miesiąca(liczba) godziny:minuty:sekundy rok


    Minusem jest to, że słowne zwrócenie dnia i miesiąca jest w języku angielskim, ale w tych czasach chyba każdy zna angielskie dni tygodnia i miesiące więc nie ma z tym problemu. Przykładowy program wykorzystujący tą funkcję
    C/C++
    #include <time.h>
    #include <conio.h>
    #include <iostream>

    int main()
    {
        time_t czas;
        struct tm * ptr;
        time( & czas );
        ptr = localtime( & czas );
        char * data = asctime( ptr );
        std::cout << "Data: " << data;
        getch();
        return 0;
    }
  • clock_t – zwraca czas od kiedy program został uruchomiony
    Jeżeli nie ma dostępu do tej informacji funkcja zwróci wartość -1. Najwygodniej skonwertować czas który zwraca funkcja na sekundy używając CLOCKS_PER_SEC.
    Przykład użycia
    C/C++
    #include <time.h>
    #include <conio.h>
    #include <iostream>

    void czekaj( int sekundy )
    {
        clock_t koniec_czekania;
        koniec_czekania = clock() + sekundy * CLOCKS_PER_SEC;
        while( clock() < koniec_czekania ) { }
    }

    int main()
    {
        std::cout << "Program zamknie sie za:" << std::endl;
        for( int i = 5; i > 0; i-- ) {
            std::cout << i << std::endl;
            czekaj( 1 );
        }
        return 0;
    }
  • ctime – działa podobnie jak asctime, ale jest krótsza w kodzie :)
    Przykład:
    C/C++
    #include <time.h>
    #include <conio.h>
    #include <iostream>

    int main() {
       
        time_t czas;
        time( & czas );
        char * data = ctime( & czas );
        std::cout << "Data: " << data;
        getch();
        return 0;
    }
  • difftime – zwraca różnicę pomiędzy dwoma czasami
    Przykład:
    C/C++
    #include <time.h>
    #include <conio.h>
    #include <iostream>

    using namespace std;

    int main() {
       
        time_t start, koniec;
        int rozwiazanie;
        double roznica;
       
        time( & start );
        cout << "Ile to 6+3 ?" << endl;
        do {
            cin >> rozwiazanie;
        } while( rozwiazanie != 9 );
       
        time( & koniec );
        roznica = difftime( koniec, start );
        cout << "\nGratulacja, poprawny wynik!\nObliczenia zajely Ci: " << roznica << " sekund";
       
        getch();
        return 0;
    }
  • gmtime – zwraca czas skoordynowany z Greenwich
    składnia:
    struct tm * gmtime( const time_t * time );

    Żeby podać czas w jakimś miejscu na ziemi trzeba dodać różnicę czasu. np. Phoenix (U.S.A.): -7 h.
  • localtime – konwertuje czas kalendarzowy na lokalny
    Na przykładzie(niepełnym tym razem) wygląda to tak:
    C/C++
    time_t czas;
    time( & czas ); // pobiera czas kalendarzowy
    tm * t = localtime( & czas ); // zamienia czas kalendarzowy na lokalny
    Teraz można użyć np. funkcji ctime by wyświetlić pełną datę z czasu lokalnego.
  • mktime – konwertuje czas na kalendarzowy
    Przykład:
    C/C++
    #include <time.h>
    #include <conio.h>
    #include <iostream>

    using namespace std;

    int main() {
       
        time_t czas;
        struct tm * data;
        int rok, miesiac, dzien;
        const char * dzien_tygodnia[] = { "Niedziela", "Poniedzialek",
            "Wtorek", "Sroda", "Czwartek", "Piatek", "Sobota" };
       
        cout << "**Dzien urodzin**" << endl;
        cout << "Rok urodzenia: ";
        cin >> rok;
        cout << "Miesiac urodzenia: ";
        cin >> miesiac;
        cout << "Dzien urodzenia: ";
        cin >> dzien;
       
        time( & czas );
        data = localtime( & czas );
        data->tm_year = rok - 1900;
        data->tm_mon = miesiac - 1;
        data->tm_mday = dzien;
       
        mktime( data );
       
        cout << "Dzien Twoich narodzin to: " << dzien_tygodnia[ data->tm_wday ];
       
        getch();
        return 0;
    }
  • strftime – chyba najprzydatniejsza funkcja, gdyż dzięki niej możemy wyświetlić dokładnie te elementy daty i czasu, które są nam potrzebne
    Obszerny opis funkcji znajduje się w dokumentacji » standard Cstrftime.
    Przykład:
    C/C++
    #include <time.h>
    #include <conio.h>
    #include <iostream>

    using namespace std;

    int main() {
       
        time_t czas;
        struct tm * data;
        char godzina[ 80 ];
       
        time( & czas );
        data = localtime( & czas );
       
        strftime( godzina, 80, "Teraz jest %H:%M:%S.", data );
        cout << godzina;
       
        getch();
        return 0;
    }
  • time – pobiera czas kalendarzowy
    Przykład:
    C/C++
    #include <time.h>
    #include <conio.h>
    #include <iostream>

    using namespace std;

    int main() {
       
        time_t sekundy;
        sekundy = time( NULL );
        cout << sekundy / 3600 << " godzin uplynelo od 1 stycznia 1970r.";
       
        getch();
        return 0;
    }
Poprzedni dokumentNastępny dokument
Obsługa klawiatury za pomocą <conio.h>Biblioteka <math.h>