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 : #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <ctime> #include <sstream> using namespace std;
void data_i_godzina( int sekundy ) { int rok = 1970; while( sekundy >= 31536000 ) { if(( rok % 4 ) == 0 ) { sekundy = sekundy - 31622400; rok++; } sekundy = sekundy - 31536000; rok++; } int dzien = 1; while( sekundy >= 86400 ) { sekundy = sekundy - 86400; dzien++; } int godzina = 1; while( sekundy >= 3600 ) { if( godzina == 24 ) { godzina = 0; dzien++; } sekundy = sekundy - 3600; godzina++; } int minuty = 0; while( sekundy >= 60 ) { sekundy = sekundy - 60; minuty++; } int miesiac = 1; if( rok % 4 == 0 ) { if( dzien >= 336 ) { miesiac = 12; } else if( dzien >= 306 ) { miesiac = 11; } else if( dzien >= 274 ) { miesiac = 10; } else if( dzien >= 245 ) { miesiac = 9; } else if( dzien >= 214 ) { miesiac = 8; } else if( dzien >= 182 ) { miesiac = 7; } else if( dzien >= 153 ) { miesiac = 6; } else if( dzien >= 121 ) { miesiac = 5; } else if( dzien >= 92 ) { miesiac = 4; } else if( dzien >= 61 ) { miesiac = 3; } else if( dzien >= 32 ) { miesiac = 2; } else if( dzien >= 1 ) { miesiac = 1; } } else if( dzien >= 335 ) { miesiac = 12; } else if( dzien >= 305 ) { miesiac = 11; } else if( dzien >= 273 ) { miesiac = 10; } else if( dzien >= 244 ) { miesiac = 9; } else if( dzien >= 213 ) { miesiac = 8; } else if( dzien >= 181 ) { miesiac = 7; } else if( dzien >= 152 ) { miesiac = 6; } else if( dzien >= 120 ) { miesiac = 5; } else if( dzien >= 91 ) { miesiac = 4; } else if( dzien >= 60 ) { miesiac = 3; } else if( dzien >= 32 ) { miesiac = 2; } else if( dzien >= 1 ) { 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() { 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ę :/. |
|
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>. |
|
YooSy |
» 2018-01-25 23:55:56 #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> |
|
mateczek |
» 2018-01-26 12:07:19 do { sekundy = sekundy - 3600; godzina++; } while( sekundy >= 3600 );
godzina = sekundy / 3600 |
|
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 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 . |
|
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? |
|
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. |
|
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. |
|
« 1 » 2 |