Dreux Temat założony przez niniejszego użytkownika |
Jak w C++ wstawić własną(!) datę? » 2015-05-12 11:28:25 Znane są mi jedynie funkcje, które pobierają czas lokalny albo UTW. Tymczasem chce, by dany program wykonywał się do godziny X. Jak wiadomo, obecnie mam godzinę "lokalną", a więc szukam sposobu, by ustawić własną datę. Załóżmy od teraz w stringu czas będzie data z 2018 roku. Z góry dziękuję, pozdrawiam.
Edit:wiem, że można to zrobić poprzez porównanie stringów (ten drugi napisałabym "ręcznie" i dopóki pierwszy z localtime nie będzie się zgadzać z drugim to pętla będzie wykonywana), lecz nie wydaje się to być zbyt profesjonalną metodą. |
|
Monika90 |
» 2015-05-12 12:26:43 Edit:wiem, że można to zrobić poprzez porównanie stringów (ten drugi napisałabym "ręcznie" i dopóki pierwszy z localtime nie będzie się zgadzać z drugim to pętla będzie wykonywana), lecz nie wydaje się to być zbyt profesjonalną metodą.
|
To jest prawdopodobnie dobry pomysł, tylko zamiast porównywać stringi lepiej porównywać wartości typu time_t, czyli to co zwraca funkcja time. Za pomocą funkcji mktime można zamienić datę na time_t. Całość mogłaby wyglądać tak #include <iostream> #include <chrono> #include <thread> #include <ctime>
std::time_t make_time_t( int year, int month, int day, int hour, int min, int sec ) { std::tm t { }; t.tm_year = year - 1900; t.tm_mon = month - 1; t.tm_mday = day; t.tm_hour = hour; t.tm_min = min; t.tm_sec = sec; t.tm_isdst = - 1; return std::mktime( & t ); }
int main() { const auto deadline = make_time_t( 2015, 5, 12, 12, 30, 0 ); while( std::time( nullptr ) < deadline ) { std::cout << '.'; std::this_thread::sleep_for( std::chrono::seconds( 1 ) ); } std::cout << "\ntimeout\n"; }
|
|
darko202 |
» 2015-05-12 12:30:13 |
|
Dreux Temat założony przez niniejszego użytkownika |
» 2015-05-13 17:47:48 @Monika90, a czy przypadkiem przedstawiony program nie będzie ograniczony? Przykładowo program ma być uruchamiany codziennie, zawsze w różnych godzinach. I ma się kończyć zawsze ileś czasu potem. Jeżeli weźmiemy to bardziej toporne rozwiązanie to będzie ono w porządku, ale na jeden dzień. Bo potem będzie trzeba ciągle zmieniać datę, co jest po prostu męczące i dalekie od perfekcjonizmu. Dlatego szukam rozwiązania uniwersalnego. |
|
pekfos |
» 2015-05-13 17:55:15 I ma się kończyć zawsze ileś czasu potem. |
Samo time(). const auto deadline = std::time( nullptr ) + T; while( std::time( nullptr ) < deadline ) Dlatego szukam rozwiązania uniwersalnego. |
To dlaczego pytasz o ograniczone rozwiązanie..? Chcesz uniwersalnie, masz biblioteki <ctime> i <chrono>. Używaj według potrzeb. |
|
Maciek |
» 2015-05-13 19:02:26 |
|
Monika90 |
» 2015-05-13 19:42:31 #include <iostream> #include <chrono> #include <thread>
int main() { using namespace std::chrono_literals; const auto now = std::chrono::steady_clock::now; const auto deadline = now() +( 1h + 15min + 25s ); while( now() < deadline ) { std::cout << '.'; std::this_thread::sleep_for( 500ms ); } }
u mnie działa |
|
« 1 » |