Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wypisanie daty i godziny w c++

Ostatnio zmodyfikowano 2018-01-26 14:08
Autor Wiadomość
michw
Temat założony przez niniejszego użytkownika
Wypisanie daty i godziny w c++
» 2018-01-25 23:41:36
Cześć potrzebowałem do swojego projekciku wczytania aktualnej daty i godziny (projekcik to taka pseudo baza danych w której klienci mogą wypożyczyć samochód stąd potrzebna mi była data i godzina "wypożyczenia") ale nie o tym znalazłem biblioteki <time.h> oraz <ctime> jednak jako, że nie potrafiłem za bardzo ogarnąć jak dokładnie działają ich funkcje ? Postanowiłem stworzyć swoją.

Wiedząc, że funkcja (?) :
time_t sekundy = time( 0 );

zwróci mi ile upłynęło sekund od 1 stycznia 1970 roku stworzyłem coś takiego :

C/C++
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <ctime>
#include <sstream>
using namespace std;

void data_i_godzina( int sekundy ) // rok przestepny 366 zamiast 365 dni podzielny przez 4 bez reszty
{
    int rok = 1970;
    //////////////////////////////// Liczy ktory mamy rok z uwzglednieniem roku przestepnego
    while( sekundy >= 31536000 )
    {
        if(( rok % 4 ) == 0 )
        {
            sekundy = sekundy - 31622400;
            rok++;
        }
       
        sekundy = sekundy - 31536000;
        rok++;
    }
   
    ////////////////////////////////// Liczy ktory mamy dzien
   
    int dzien = 1;
   
    while( sekundy >= 86400 )
    {
        sekundy = sekundy - 86400;
        dzien++;
       
    }
   
   
    ///////////////////////////////// Ktora mamy godzine
    int godzina = 1;
   
    while( sekundy >= 3600 )
    {
        if( godzina == 24 )
        {
            godzina = 0;
            dzien++;
        }
       
        sekundy = sekundy - 3600;
        godzina++;
       
       
    }
   
    ///////////// MINUTY
   
    int minuty = 0;
   
    while( sekundy >= 60 )
    {
        sekundy = sekundy - 60;
        minuty++;
       
    }
   
   
    ///////////////////////////////// Ktory mamy miesiac
    int miesiac = 1;
   
    if( rok % 4 == 0 ) // rok przestepny luty ma 29 dni
    {
        if( dzien >= 336 ) //  1 dzien grudnia
        {
            miesiac = 12;
        }
        else
        if( dzien >= 306 ) //  1 dzien listopada
        {
            miesiac = 11;
        }
        else
        if( dzien >= 274 ) //  1 dzien pazdziernika
        {
            miesiac = 10;
        }
        else
        if( dzien >= 245 ) //  1 dzien wrzesnia
        {
            miesiac = 9;
        }
        else
        if( dzien >= 214 ) //  1 dzien sierpnia
        {
            miesiac = 8;
        }
        else
        if( dzien >= 182 ) //  1 dzien lipca
        {
            miesiac = 7;
        }
        else
        if( dzien >= 153 ) // 1  dzien czerwca
        {
            miesiac = 6;
        }
        else
        if( dzien >= 121 ) // 1 dzien maja
        {
            miesiac = 5;
        }
        else
        if( dzien >= 92 ) //  1 dzien kwietnia
        {
            miesiac = 4;
        }
        else
        if( dzien >= 61 ) //  1 dzien marca
        {
            miesiac = 3;
        }
        else
        if( dzien >= 32 ) // 1 dzien lutego
        {
            miesiac = 2;
        }
        else
        if( dzien >= 1 ) //  1 dzien grudnia stycznia
        {
            miesiac = 1;
        }
       
    } else
    if( dzien >= 335 ) //  1 dzien grudnia
    {
        miesiac = 12;
    } else
    if( dzien >= 305 ) //  1 dzien listopada
    {
        miesiac = 11;
    } else
    if( dzien >= 273 ) //  1 dzien pazdziernika
    {
        miesiac = 10;
    } else
    if( dzien >= 244 ) //  1 dzien wrzesnia
    {
        miesiac = 9;
    } else
    if( dzien >= 213 ) //  1 dzien sierpnia
    {
        miesiac = 8;
    } else
    if( dzien >= 181 ) //  1 dzien lipca
    {
        miesiac = 7;
    } else
    if( dzien >= 152 ) // 1  dzien czerwca
    {
        miesiac = 6;
    } else
    if( dzien >= 120 ) // 1 dzien maja
    {
        miesiac = 5;
    } else
    if( dzien >= 91 ) //  1 dzien kwietnia
    {
        miesiac = 4;
    } else
    if( dzien >= 60 ) //  1 dzien marca
    {
        miesiac = 3;
    } else
    if( dzien >= 32 ) // 1 dzien lutego
    {
        miesiac = 2;
    } else
    if( dzien >= 1 ) //  1 dzien grudnia stycznia
    {
        miesiac = 1;
    }
   
    string nowa_sekunda;
    string nowa_minuta;
    string nowa_godzina;
   
    ostringstream nowy_g, nowy_m, nowy_s;
    nowy_g << godzina;
    nowy_m << minuty;
    nowy_s << sekundy;
    nowa_godzina = nowy_g.str();
    nowa_minuta = nowy_m.str();
    nowa_sekunda = nowy_s.str();
   
    if( godzina >= 0 && godzina < 10 )
    {
        ostringstream nowy;
        nowy << godzina;
        string min = nowy.str();
        nowa_godzina = "0" + min;
    }
   
    if( minuty >= 0 && minuty < 10 )
    {
        ostringstream nowy2;
        nowy2 << minuty;
        string min = nowy2.str();
        nowa_minuta = "0" + min;
    }
   
    if( sekundy >= 0 && sekundy < 10 )
    {
        ostringstream nowy1;
        nowy1 << sekundy;
        string min = nowy1.str();
        nowa_sekunda = "0" + min;
    }
   
   
    cout << "Dzisiejsza data : " << dzien << "-" << miesiac << "-" << rok << endl;
   
    cout << "Godzina - " << nowa_godzina << ":" << nowa_minuta << ":" << nowa_sekunda << endl;
   
   
}

int main()
{
   
    // current date/time based on current system
    time_t sekundy = time( 0 );
   
    cout << "Liczba sekund od 1 Stycnia 1970r :" << sekundy << endl;
    cout << "Czyli : " << endl;
    data_i_godzina( sekundy );
   
    system( "PAUSE" );
   
}
Drobna aktualizacja ^

Miałby ktoś pomysł jak ulepszyć miesiące bo nie podoba mi się trochę tona ifów :/.
Prosiłbym jeszcze o kogoś z większym doświadczeniem o opinie czy jest to dobrze napisane w sumie nie wiem jak to przetestować oprócz tego, że na razie zwraca dobrą godzinę i datę :/.
P-168998
pekfos
» 2018-01-25 23:51:32
nie podoba mi się trochę tona ifów :/.
Tablice i pętle.

nie wiem jak to przetestować oprócz tego, że na razie zwraca dobrą godzinę i datę :/.
Przetestuj siłowo dla kolejnych dat w sekundach. Jako implementacja wzorcowa: <ctime>.
P-168999
YooSy
» 2018-01-25 23:55:56
C/C++
#include <iostream>
#include <chrono>

int main()
{
    std::chrono::system_clock::time_point tp = std::chrono::system_clock::now();
    time_t t = std::chrono::system_clock::to_time_t( tp );
    std::cout << std::ctime( & t ) << std::endl;
}

<chrono>
P-169001
mateczek
» 2018-01-26 12:07:19
C/C++
do
{
    sekundy = sekundy - 3600;
    godzina++;
   
} while( sekundy >= 3600 );
//dlaczego nie
godzina = sekundy / 3600
P-169009
michw
Temat założony przez niniejszego użytkownika
» 2018-01-26 12:52:26
Mateczek w sumie nie wiem chyba dlatego, że nie chciałem reszty z dzielenia :/, dostrzegłem pewne problemy po godzinie 24 dalej dodawał np. zamiast 0:30 było 24:30 więc dodałem
C/C++
int godzina = 1;
do
{
    if( godzina == 24 )
    {
        godzina = 0;
        dzien++;
    }
   
    sekundy = sekundy - 3600;
    godzina++;
   
   
} while( sekundy >= 3600 );


i wrzuciłem to nad if który sprawdza jaki mamy miesiąc żeby w razie czego najpierw dodał się dzień :).

około 1 w nocy zaczęły mi wyskakiwać też sekundy z znakiem - np.(-3000) i program się trochę sypał ale nie doszedłem dlaczego(wydaje mi, że do przez pętle do..while bo to co w środku wykona się zawsze przynajmniej 1 raz i coś z tym mogło być nie tak ? poprawię na pętle while.. wtedy najpierw sprawdzi czy jest wgle tyle sekund, żeby coś odjąć ), dzisiaj na razie wszystko działa .
P-169010
geceves
» 2018-01-26 13:07:52
@michw,


nie potrafiłem za bardzo ogarnąć jak dokładnie działają ich funkcje ? Postanowiłem stworzyć swoją.
Użyj czegoś co zrobi to wszystko za Ciebie, ponieważ uniknięcie błędu będzie niemożliwe.


projekcik to taka pseudo baza danych w której klienci mogą wypożyczyć samochód stąd potrzebna mi była data i godzina "wypożyczenia"
Co zrobi Twój program jeżeli wypożyczę auto o godzinie 2018-09-28 2:45 a oddam 2018-09-28 02:15?

P-169011
michw
Temat założony przez niniejszego użytkownika
» 2018-01-26 13:38:41
Wiadomo, że użycie gotowca będzie "łatwiejsze" ale tak zawsze się czegoś nauczę :D albo przynajmniej powtórzę a i w przyszłości to może być moja biblioteka do daty i czasu :P

"Co zrobi Twój program jeżeli wypożyczę auto o godzinie 2018-09-28 2:45 a oddam 2018-09-28 02:15?"
Możesz rozwinąć nie do końca rozumiem przecież nie cofniesz się w czasie :D ?


Dodałem aktualizację do kodu, użyłem pętli while mam nadzieję, że nie będzie się już sypał i dodałem jeszcze żeby jak wypisuje sekundy 0-9 pisał 01,02,02,...,09 tak samo z minutami i godzinami.
P-169012
geceves
» 2018-01-26 13:57:33

Możesz rozwinąć nie do końca rozumiem przecież nie cofniesz się w czasie :D ?
Nie muszę się cofać. Pierwsza z dat była przed zmianą czasu a druga po.

Wyobraź sobie jak aplikacja będzie używana:
Klient oddaje samochód a pani odbierająca klucze co zrobi? Wpisze to w sekundach? Czy system uzna za godzinę oddania moment gdy obsługa komputera wciśnie przycisk "oddano"? Więc zaraz będziesz potrzebował parsowania z daty, do sekund.

Generalnie najwygodniej w systemach używać czasu UTC oraz ten czas konwertować dopiero do lokalnej daty. Jeżeli napiszesz system, który będzie tak właśnie działał to masz szansę nauczyć się prawdziwej obsługi czasu, która mogłaby istnieć w prawdziwym systemie, a tak tylko namęczysz się z kaskadą ifów. 
P-169014
« 1 » 2
  Strona 1 z 2 Następna strona