mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-12 10:30:08 +01:00
std::chrono::system_clock.time_since_epoch and time_t(0) are not guaranteed to use the Unix epoch timestamp, but in practice they almost certainly will. Any differing behavior will be assumed to be an error, unless certain platforms prove to consistently deviate, at which point we'll cope with it by adding offsets. Do a quick runtime check to verify that time_t(0) == std::chrono::system_clock's epoch time == unix epoch. Co-authored-by: Anthony Towns <aj@erisian.com.au>
76 lines
2.3 KiB
C++
76 lines
2.3 KiB
C++
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
|
// Copyright (c) 2009-2020 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#ifndef BITCOIN_UTIL_TIME_H
|
|
#define BITCOIN_UTIL_TIME_H
|
|
|
|
#include <compat.h>
|
|
|
|
#include <chrono>
|
|
#include <stdint.h>
|
|
#include <string>
|
|
|
|
using namespace std::chrono_literals;
|
|
|
|
void UninterruptibleSleep(const std::chrono::microseconds& n);
|
|
|
|
/**
|
|
* Helper to count the seconds of a duration.
|
|
*
|
|
* All durations should be using std::chrono and calling this should generally
|
|
* be avoided in code. Though, it is still preferred to an inline t.count() to
|
|
* protect against a reliance on the exact type of t.
|
|
*
|
|
* This helper is used to convert durations before passing them over an
|
|
* interface that doesn't support std::chrono (e.g. RPC, debug log, or the GUI)
|
|
*/
|
|
inline int64_t count_seconds(std::chrono::seconds t) { return t.count(); }
|
|
inline int64_t count_milliseconds(std::chrono::milliseconds t) { return t.count(); }
|
|
inline int64_t count_microseconds(std::chrono::microseconds t) { return t.count(); }
|
|
|
|
/**
|
|
* DEPRECATED
|
|
* Use either GetSystemTimeInSeconds (not mockable) or GetTime<T> (mockable)
|
|
*/
|
|
int64_t GetTime();
|
|
|
|
/** Returns the system time (not mockable) */
|
|
int64_t GetTimeMillis();
|
|
/** Returns the system time (not mockable) */
|
|
int64_t GetTimeMicros();
|
|
/** Returns the system time (not mockable) */
|
|
int64_t GetSystemTimeInSeconds(); // Like GetTime(), but not mockable
|
|
|
|
/** For testing. Set e.g. with the setmocktime rpc, or -mocktime argument */
|
|
void SetMockTime(int64_t nMockTimeIn);
|
|
/** For testing */
|
|
int64_t GetMockTime();
|
|
|
|
/** Return system time (or mocked time, if set) */
|
|
template <typename T>
|
|
T GetTime();
|
|
|
|
/**
|
|
* ISO 8601 formatting is preferred. Use the FormatISO8601{DateTime,Date}
|
|
* helper functions if possible.
|
|
*/
|
|
std::string FormatISO8601DateTime(int64_t nTime);
|
|
std::string FormatISO8601Date(int64_t nTime);
|
|
int64_t ParseISO8601DateTime(const std::string& str);
|
|
|
|
/**
|
|
* Convert milliseconds to a struct timeval for e.g. select.
|
|
*/
|
|
struct timeval MillisToTimeval(int64_t nTimeout);
|
|
|
|
/**
|
|
* Convert milliseconds to a struct timeval for e.g. select.
|
|
*/
|
|
struct timeval MillisToTimeval(std::chrono::milliseconds ms);
|
|
|
|
/** Sanity check epoch match normal Unix epoch */
|
|
bool ChronoSanityCheck();
|
|
|
|
#endif // BITCOIN_UTIL_TIME_H
|