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>则提供了基础的时间管理功能。根据具体需求选择合适的方法,可以让你的程序更高效地处理时间相关任务。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐