C++获取时间和时间戳以及转换
在C++中,获取当前系统时间和将其转换为时间戳是一个常见的任务。本文将介绍一些常用的方法来执行这些操作。
·
C++获取时间和时间戳以及转换
在C++中,获取当前系统时间和将其转换为时间戳是一个常见的任务。本文将介绍一些常用的方法来执行这些操作。
源码
#pragma once
#include <chrono>
#include <iomanip>
#include <sstream>
#include <string>
#include <ctime>
// 获取当前时间戳(秒)
inline std::uint64_t CurrentTimestampS()
{
return std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count();
}
// 获取当前时间戳(毫秒)
inline std::uint64_t CurrentTimestampMS()
{
return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
}
// 获取当前时间(秒)
inline std::string DateTime(const std::string &format = "%Y-%m-%d %H:%M:%S")
{
auto now = std::chrono::system_clock::now();
auto time_t = std::chrono::system_clock::to_time_t(now);
std::tm tm;
#ifdef _WIN32
localtime_s(&tm, &time_t);
#elif defined(__linux__)
localtime_r(&time_t, &tm);
#endif
std::ostringstream oss;
oss << std::put_time(&tm, format.c_str());
return oss.str();
}
// 获取当前时间(毫秒)
inline std::string DateTimeMs(const std::string &ms_separator = ".", const std::string &format = "%Y-%m-%d %H:%M:%S")
{
auto now = std::chrono::system_clock::now();
auto time_t = std::chrono::system_clock::to_time_t(now);
std::tm tm;
#ifdef _WIN32
localtime_s(&tm, &time_t);
#elif defined(__linux__)
localtime_r(&time_t, &tm);
#endif
std::ostringstream oss;
oss << std::put_time(&tm, format.c_str());
// 获取毫秒部分
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;
oss << ms_separator << std::setw(3) << std::setfill('0') << ms.count(); // 添加毫秒部分
return oss.str();
}
// 时间戳(秒)转时间(字符串)
inline std::string TimestampS2DateTime(std::uint64_t timestamp_s, const std::string &format = "%Y-%m-%d %H:%M:%S")
{
std::time_t time = timestamp_s;
std::tm tm;
#ifdef _WIN32
localtime_s(&tm, &time);
#elif defined(__linux__)
localtime_r(&time, &tm);
#endif
std::ostringstream oss;
oss << std::put_time(&tm, format.c_str());
return oss.str();
}
// 时间戳(毫秒)转时间(字符串)
inline std::string TimestampMS2DateTime(std::uint64_t timestamp_ms, const std::string& ms_separator = ".", const std::string &format = "%Y-%m-%d %H:%M:%S")
{
std::time_t time = timestamp_ms / 1000;
std::tm tm;
#ifdef _WIN32
localtime_s(&tm, &time);
#elif defined(__linux__)
localtime_r(&time, &tm);
#endif
std::ostringstream oss;
oss << std::put_time(&tm, format.c_str());
oss << ms_separator << std::setfill('0') << std::setw(3) << (timestamp_ms % 1000);
return oss.str();
}
// 时间(字符串)转时间戳(秒)
inline std::uint64_t DateTime2TimestampS(const std::string &datetime, const std::string &format = "%Y-%m-%d %H:%M:%S")
{
struct tm tm;
std::istringstream ss(datetime);
ss >> std::get_time(&tm, format.c_str());
if (ss.fail())
{
throw std::invalid_argument("Invalid time format");
}
auto tp = std::chrono::system_clock::from_time_t(std::mktime(&tm));
return std::chrono::duration_cast<std::chrono::seconds>(tp.time_since_epoch()).count();
}
// 时间(字符串)转时间戳(毫秒)
inline std::uint64_t DateTime2TimestampMS(const std::string &datetime, const std::string& ms_separator = ".", const std::string &format = "%Y-%m-%d %H:%M:%S")
{
// 时间字符串中的秒部分和毫秒部分
std::string timeStr = datetime;
int milliseconds = 0;
// 查找是否有毫秒部分
size_t dot_pos = timeStr.find(ms_separator);
if (dot_pos != std::string::npos)
{
// 如果有,截取出毫秒部分
std::string ms_str = timeStr.substr(dot_pos + 1);
milliseconds = std::stoi(ms_str.substr(0, 3)); // 只取前三位,精确到毫秒
timeStr = timeStr.substr(0, dot_pos); // 去掉毫秒部分,保留到秒
}
struct tm tm;
std::istringstream ss(datetime);
ss >> std::get_time(&tm, format.c_str());
if (ss.fail())
{
throw std::invalid_argument("Invalid time format");
}
auto tp = std::chrono::system_clock::from_time_t(std::mktime(&tm));
return std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch()).count() + milliseconds;
}
测试
#include <iostream>
#include <date_time.h>
int main(int argc, char* argv[])
{
// 测试获取当前时间戳(秒和毫秒)
std::cout << "Current timestamp (seconds): " << CurrentTimestampS() << std::endl;
std::cout << "Current timestamp (milliseconds): " << CurrentTimestampMS() << std::endl;
// 测试获取当前时间字符串(秒和毫秒)
std::cout << "Current datetime (seconds): " << DateTime() << std::endl;
std::cout << "Current datetime (milliseconds): " << DateTimeMs() << std::endl;
// 测试时间戳到时间字符串转换
long long timestamp = CurrentTimestampMS();
std::cout << "Timestamp to datetime (seconds): " << TimestampS2DateTime(timestamp / 1000) << std::endl;
std::cout << "Timestamp to datetime (milliseconds): " << TimestampMS2DateTime(timestamp) << std::endl;
// 测试时间字符串到时间戳转换
std::string datetime = "2024-12-06 12:30:45";
long long ts_seconds = DateTime2TimestampS(datetime);
std::cout << "Datetime to timestamp (seconds): " << ts_seconds << std::endl;
std::string datetime_ms = "2024-12-06 12:30:45.123";
long long ts_milliseconds = DateTime2TimestampMS(datetime_ms);
std::cout << "Datetime to timestamp (milliseconds): " << ts_milliseconds << std::endl;
std::system("pause");
return 0;
}

结论
C++提供了多种方法来获取当前时间和时间戳,并可以将时间戳转换为可读格式。<chrono>库提供了更加现代化的时间操作方式,而<ctime>则提供了基础的时间管理功能。根据具体需求选择合适的方法,可以让你的程序更高效地处理时间相关任务。
更多推荐
所有评论(0)