feat: datetime,uuid
This commit is contained in:
65
include/cpputils/datetime.h
Normal file
65
include/cpputils/datetime.h
Normal file
@@ -0,0 +1,65 @@
|
||||
#pragma once
|
||||
|
||||
#include <chrono>
|
||||
#include <cstdint>
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
namespace cpputils {
|
||||
namespace datetime {
|
||||
|
||||
inline auto print_iso8601_utc(std::chrono::system_clock::time_point tp)
|
||||
-> std::string {
|
||||
time_t t = std::chrono::system_clock::to_time_t(tp);
|
||||
std::tm utc_tm = *std::gmtime(&t);
|
||||
std::ostringstream oss;
|
||||
oss << std::put_time(&utc_tm, "%Y-%m-%dT%H:%M:%SZ");
|
||||
return oss.str();
|
||||
};
|
||||
|
||||
inline auto print_iso8601_local(std::chrono::system_clock::time_point tp)
|
||||
-> std::string {
|
||||
std::time_t time = std::chrono::system_clock::to_time_t(tp);
|
||||
std::tm local_tm = *std::localtime(&time);
|
||||
std::ostringstream oss;
|
||||
oss << std::put_time(&local_tm, "%Y-%m-%dT%H:%M:%S");
|
||||
return oss.str();
|
||||
}
|
||||
|
||||
inline int64_t now() {
|
||||
return static_cast<int64_t>(
|
||||
std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
std::chrono::system_clock::now().time_since_epoch())
|
||||
.count());
|
||||
}
|
||||
|
||||
inline std::chrono::system_clock::time_point to_time_point(
|
||||
int64_t timestamp_ms) {
|
||||
return std::chrono::system_clock::time_point(
|
||||
std::chrono::milliseconds(timestamp_ms));
|
||||
}
|
||||
|
||||
inline int64_t to_timestamp(std::chrono::system_clock::time_point tp) {
|
||||
return std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
tp.time_since_epoch())
|
||||
.count();
|
||||
}
|
||||
|
||||
inline int64_t to_timestamp_seconds(std::chrono::system_clock::time_point tp) {
|
||||
return std::chrono::duration_cast<std::chrono::seconds>(tp.time_since_epoch())
|
||||
.count();
|
||||
}
|
||||
|
||||
template <typename Duration>
|
||||
inline int64_t add_to_timestamp(int64_t timestamp, Duration duration) {
|
||||
auto time_point = std::chrono::system_clock::time_point(
|
||||
std::chrono::milliseconds(timestamp));
|
||||
time_point += duration;
|
||||
return std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
time_point.time_since_epoch())
|
||||
.count();
|
||||
}
|
||||
|
||||
} // namespace datetime
|
||||
} // namespace cpputils
|
||||
53
include/cpputils/uuid.h
Normal file
53
include/cpputils/uuid.h
Normal file
@@ -0,0 +1,53 @@
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
#include <atomic>
|
||||
#include <cstdint>
|
||||
#include <random>
|
||||
#include <string>
|
||||
|
||||
namespace cpputils {
|
||||
namespace uuid {
|
||||
|
||||
extern std::string uuidToString(std::array<uint8_t, 16> const& uuid) noexcept;
|
||||
|
||||
class V4 {
|
||||
private:
|
||||
std::mt19937_64 rng;
|
||||
|
||||
inline uint64_t random64() { return rng(); }
|
||||
|
||||
public:
|
||||
inline V4() : rng(std::random_device{}()) {}
|
||||
|
||||
std::array<uint8_t, 16> generate();
|
||||
};
|
||||
|
||||
class V7 {
|
||||
|
||||
private:
|
||||
std::atomic<int64_t> last_timestamp{0};
|
||||
std::atomic<uint8_t> sequence{0};
|
||||
std::mt19937_64 rng;
|
||||
|
||||
inline uint64_t random64() { return rng(); }
|
||||
|
||||
uint8_t next_sequence(int64_t current_timestamp);
|
||||
|
||||
public:
|
||||
inline V7() : rng(std::random_device{}()) {}
|
||||
|
||||
static inline uint64_t get_timestamp_from_uuid(
|
||||
std::array<uint8_t, 16> const& uuid) noexcept {
|
||||
uint64_t timestamp = 0;
|
||||
for (size_t i = 0; i < 6; ++i) {
|
||||
timestamp = (timestamp << 8) | uuid[i];
|
||||
}
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
std::array<uint8_t, 16> generate();
|
||||
};
|
||||
|
||||
} // namespace uuid
|
||||
} // namespace cpputils
|
||||
Reference in New Issue
Block a user