Czy istnieje wieloplatformowy sposób na uzyskanie bieżącej daty i godziny w C ++?
c++
date
time
cross-platform
Max Frai
źródło
źródło
tm
strukturę. Czy podejście C ++ 11 nie podaje tylko sygnatury czasowej unix (czas od epoki), chociaż pytanie dotyczyło uzyskania daty i godziny?Odpowiedzi:
W C ++ 11 możesz używać
std::chrono::system_clock::now()
Przykład (skopiowany z en.cppreference.com ):
Powinno to wydrukować coś takiego:
źródło
string
zstream
, czyli jak prawidłowo sformatowaćtime_point<>
, należy iść dalej i zadać kolejne pytanie lub google po niej.C ++ udostępnia swoje funkcje daty / godziny C. Struktura tm jest prawdopodobnie najłatwiejsza w obsłudze dla programisty C ++ - poniższe dane drukują dzisiejszą datę:
źródło
ctime()
tej odpowiedzi, jeśli chcesz ciąg daty.struct tm
czy można po prostu wywołać na nim usunięcie?delete
(słowa kluczowego c ++), po prostu pomyślałem, że należy go jakoś usunąć :) lub kto to zrobi?Możesz wypróbować następujący kod międzyplatformowy, aby uzyskać bieżącą datę / godzinę:
Wynik:
Odwiedź tutaj, aby uzyskać więcej informacji o formacie daty / godziny
źródło
const
wartość? To bezcelowe.biblioteki std C zapewniają
time()
. To kilka sekund od epoki i można je przekonwertować na datęH:M:S
przy użyciu standardowych funkcji C. Zwiększenie ma również bibliotekę czasu / daty , którą można sprawdzić.źródło
standardowa biblioteka C ++ nie podaje poprawnego typu daty. C ++ dziedziczy struktury i funkcje do manipulacji datą i godziną po C, wraz z kilkoma funkcjami wejścia i wyjścia daty / godziny, które uwzględniają lokalizację.
źródło
Nowa odpowiedź na stare pytanie:
Pytanie nie określa, w jakiej strefie czasowej. Istnieją dwie rozsądne możliwości:
Dla 1 możesz użyć tej biblioteki dat i następującego programu:
Który właśnie dla mnie wyszedł:
Biblioteka dat zasadniczo dodaje operator przesyłania strumieniowego
std::chrono::system_clock::time_point
. Dodaje również wiele innych fajnych funkcji, ale nie jest to używane w tym prostym programie.Jeśli wolisz 2 (czas lokalny), istnieje biblioteka strefy czasowej, która jest budowana na podstawie biblioteki dat . Obie biblioteki są open source i wieloplatformowe , przy założeniu, że kompilator obsługuje C ++ 11 lub C ++ 14.
Które dla mnie tylko wyjście:
Typ wyniku z
make_zoned
jestdate::zoned_time
parą adate::time_zone
i astd::chrono::system_clock::time_point
. Ta para reprezentuje czas lokalny, ale może również reprezentować UTC, w zależności od tego, w jaki sposób go zapytanie.Dzięki powyższym wynikom możesz zobaczyć, że mój komputer znajduje się obecnie w strefie czasowej z przesunięciem UTC -4h i skrótem EDT.
Jeśli potrzebna jest inna strefa czasowa, można to również osiągnąć. Na przykład, aby znaleźć aktualny czas w Sydney w Australii, wystarczy zmienić konstrukcję zmiennej
local
na:Wyjście zmienia się na:
Aktualizacja do C ++ 20
Ta biblioteka jest obecnie w dużej mierze przystosowana do C ++ 20. Przestrzeń nazw
date
zniknęła i wszystko jeststd::chrono
teraz w przestrzeni nazw . I użyjzoned_time
zamiastmake_time
. Upuść nagłówki"date.h"
i"tz.h"
i po prostu używać<chrono>
.Gdy piszę to, na niektórych platformach zaczynają pojawiać się częściowe implementacje.
źródło
localtime
dać mi czasu w strefie czasowej?localtime
będzie prawie zawsze daje czas w lokalnej strefy czasowej do drugiej precyzją. Czasami zawiedzie z powodu problemów z bezpieczeństwem wątków i nigdy nie zadziała z dokładnością do drugiej sekundy.(Dla innych pracowników Google)
Istnieje również Boost :: date_time :
źródło
Uzyskaj aktualny czas za pomocą
std::time()
lubstd::chrono::system_clock::now()
(lub innego rodzaju zegara ).std::put_time()
(C ++ 11) istrftime()
(C) oferują wiele formatów do generowania tych czasów.Kolejność formaterów ma znaczenie:
Formaterery
strftime()
są podobne:Często formatyzator kapitału oznacza „pełną wersję”, a małe litery oznaczają skrót (np. Y: 2017, y: 17).
Ustawienia regionalne zmieniają dane wyjściowe:
Możliwe dane wyjściowe ( Coliru , Eksplorator kompilatorów ):
Użyłem
std::gmtime()
do konwersji na UTC.std::localtime()
służy do konwersji na czas lokalny.Zwróć uwagę, że
asctime()
/ctime()
które zostały wymienione w innych odpowiedziach są teraz oznaczone jako przestarzałe istrftime()
powinny być preferowane.źródło
źródło
Tak i możesz to zrobić za pomocą reguł formatowania określonych przez aktualnie nasycone ustawienia regionalne:
źródło
ostream::sentry
rzadko się to zdarza).możesz użyć klasy czasowej C ++ 11:
wynik:
źródło
Zawsze jest
__TIMESTAMP__
makro preprocesora.przykład: niedz. 13 kwietnia 11:28:08 2014
źródło
__TIMESTAMP__
to makro preprocesora, które rozwija się do bieżącego czasu (w czasie kompilacji) w postaci Ddd Mmm Data hh :: mm :: ss rrrr.__TIMESTAMP__
Makro mogą być używane do przekazywania informacji na temat danej chwili binarny został zbudowany. Patrz: cprogramming.com/reference/preprocessor/__TIMESTAMP__.htmlMożesz także bezpośrednio użyć
ctime()
:źródło
#define _CRT_SECURE_NO_DEPRECATE
przed włączeniem, aby kompilować programUważam, że ten link jest bardzo przydatny w mojej implementacji: C ++ Data i godzina
Oto kod, którego używam w swojej implementacji, aby uzyskać przejrzysty format wyjściowy „RRRRMMDD HHMMSS”. Parametr służy do przełączania między czasem UTC i czasem lokalnym. Możesz łatwo zmodyfikować mój kod, aby dopasować go do swoich potrzeb.
Wyjście (UTC, EST):
źródło
ptmNow->tm_day < 9
nie<10
?<=9
dlatego, że chcesz uwzględnić także 9.1+
w kodzie. Dzień / miesiąc zaczyna się od 0Działa to z G ++ Nie jestem pewien, czy to ci pomoże. Wyjście programu:
Kod :
źródło
Skompilowałem to dla Linuxa (RHEL) i Windowsa (x64), celując w g ++ i OpenMP:
źródło
Możesz użyć następującego kodu, aby uzyskać aktualną datę i godzinę systemową w C ++ :
PS: Odwiedź tę stronę, aby uzyskać więcej informacji.
źródło
Ffead-cpp zapewnia wiele klas użytkowych dla różnych zadań, jedna taka klasa jest data klasa, która zapewnia wiele funkcji bezpośrednio z operacji Data najświeższe arytmetyki, tam także czasowy klasa przewidziana operacji taktowania. Możesz na to spojrzeć.
źródło
http://www.cplusplus.com/reference/ctime/strftime/
Ten wbudowany wydaje się oferować rozsądny zestaw opcji.
źródło
time_t rawTime; time(&rawTime); struct tm *timeInfo; char buf[80]; timeInfo = localtime(&rawTime); strftime(buf, 80, "%T", timeInfo);
ten konkretny po prostu umieszcza HH: MM: SS. Mój pierwszy post, więc nie jestem pewien, jak uzyskać poprawny format kodu. Przepraszam za to.wersja localtime_s ():
źródło
źródło
źródło
void main
nie jest nawet standardowym C / C ++.Możesz użyć
boost
:źródło