kunlang_tbox/include/common/utils.h

81 lines
2.1 KiB
C
Raw Permalink Normal View History

2025-12-11 09:08:35 +08:00
#pragma once
#include <limits.h>
#include <unistd.h>
#include <chrono>
#include <ctime>
#include <filesystem>
#include <fstream>
#include <iomanip>
#include <sstream>
#include <string>
namespace common
{
// 获取当前北京时间字符串 (精确到毫秒)
inline std::string get_current_time_string()
{
using namespace std::chrono;
auto now = system_clock::now();
auto ms = duration_cast<milliseconds>(now.time_since_epoch()) % 1000;
// 先转 UTC
auto t = system_clock::to_time_t(now);
std::tm utc_tm = *std::gmtime(&t);
utc_tm.tm_hour += 8;
mktime(&utc_tm);
std::ostringstream oss;
oss << std::put_time(&utc_tm, "%Y-%m-%d %H:%M:%S") << '.' << std::setw(3) << std::setfill('0') << ms.count();
return oss.str();
}
// 获取当前日期字符串 (仅日期,用于日志文件名)
inline std::string get_current_date_string()
{
using namespace std::chrono;
auto now = system_clock::now();
auto t = system_clock::to_time_t(now);
// 转成 UTC
std::tm utc_tm = *std::gmtime(&t);
// UTC + 8 小时
utc_tm.tm_hour += 8;
mktime(&utc_tm); // 自动修正日期
std::ostringstream oss;
oss << std::put_time(&utc_tm, "%Y-%m-%d");
return oss.str();
}
// 获取文件大小
inline size_t get_file_size(const std::string& filename)
{
std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary);
return in.is_open() ? static_cast<size_t>(in.tellg()) : 0;
}
// 获取可执行文件目录下的文件完整路径
inline std::string get_executable_file_path(const std::string& filename)
{
char result[PATH_MAX];
ssize_t count = readlink("/proc/self/exe", result, PATH_MAX);
std::string path(result, count);
auto dir = path.substr(0, path.find_last_of('/'));
if (dir.back() != '/') dir += '/';
return dir + filename;
}
// 获取当前毫秒时间戳steady_clock不受系统时间影响
inline uint64_t get_timestamp_ms()
{
using namespace std::chrono;
return duration_cast<milliseconds>(steady_clock::now().time_since_epoch()).count();
}
} // namespace common