Λάβετε δευτερόλεπτα από την εποχή στο Linux

Λάβετε δευτερόλεπτα από την εποχή στο Linux

Το χρησιμοποιείτε ήδη:std::time(0) (μην ξεχάσετε να #include <ctime> ). Ωστόσο, είτε std::time στην πραγματικότητα επιστρέφει τον χρόνο από τη στιγμή που η εποχή δεν προσδιορίζεται στο πρότυπο (C11, που αναφέρεται από το πρότυπο C++):

Για C++, C++11 και νεότερες εκδόσεις παρέχουν time_since_epoch . Ωστόσο, μόνο στη C++20 και αργότερα την εποχή του std::chrono::system_clock προσδιορίστηκε ως Unix Time και είναι απροσδιόριστο και επομένως πιθανώς μη φορητό σε προηγούμενα πρότυπα.

Ακόμα, στο Linux το std::chrono::system_clock θα χρησιμοποιεί συνήθως Unix Time ακόμη και σε C++11, C++14 και C++17, επομένως μπορείτε να χρησιμοποιήσετε τον ακόλουθο κώδικα:

#include <chrono>

// make the decltype slightly easier to the eye
using seconds_t = std::chrono::seconds;

// return the same type as seconds.count() below does.
// note: C++14 makes this a lot easier.
decltype(seconds_t().count()) get_seconds_since_epoch()
{
    // get the current time
    const auto now     = std::chrono::system_clock::now();

    // transform the time into a duration since the epoch
    const auto epoch   = now.time_since_epoch();

    // cast the duration into seconds
    const auto seconds = std::chrono::duration_cast<std::chrono::seconds>(epoch);

    // return the number of seconds
    return seconds.count();
}

Στο C.

time(NULL);

Σε C++.

std::time(0);

Και η επιστρεφόμενη τιμή του χρόνου είναι:time_t όχι μεγάλο


Η εγγενής συνάρτηση Linux για τη λήψη χρόνου είναι gettimeofday() [υπάρχουν και κάποιες άλλες γεύσεις], αλλά αυτό σας δίνει τον χρόνο σε δευτερόλεπτα και νανοδευτερόλεπτα, που είναι περισσότερο από ό,τι χρειάζεστε, γι' αυτό θα σας πρότεινα να συνεχίσετε να χρησιμοποιείτε το time() . [Φυσικά, time() υλοποιείται καλώντας το gettimeofday() κάπου στη γραμμή - αλλά δεν βλέπω το πλεονέκτημα του να έχεις δύο διαφορετικά κομμάτια κώδικα που κάνουν ακριβώς το ίδιο πράγμα - και αν το ήθελες, θα χρησιμοποιούσες GetSystemTime() ή κάποια τέτοια στα Windows [δεν είμαι σίγουρος ότι αυτό είναι το σωστό όνομα, έχει περάσει καιρός από τότε που προγραμμάτισα στα Windows]