feat: datetime,uuid

This commit is contained in:
2026-01-27 14:33:19 +01:00
parent 9e3dd6dd1d
commit e517163d23
8 changed files with 18298 additions and 0 deletions

View 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
View 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