You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用C++输出带毫秒的指定格式当前日期时间?

解决带毫秒/微秒的日期时间格式化问题

嘿,我来帮你搞定这个时间格式化的需求!你当前用的ctimeasctime确实做不到毫秒级别的精度输出,而且它们的默认格式也不符合你想要的YYYY-MM-DD HH:MM:SS.ffffff样式。下面给你几种可行的解决方案,都是能完美输出你需要格式的:

方法一:C++11及以上标准(推荐跨平台)

用C++11引入的<chrono>高精度时间库搭配<iomanip>格式化工具,这是最标准的跨平台方案:

#include <iostream>
#include <chrono>
#include <ctime>
#include <iomanip>

int main() {
    // 获取包含微秒精度的当前系统时间点
    auto now = std::chrono::system_clock::now();
    // 转换为秒级time_t,用于后续日期时间格式化
    std::time_t now_sec = std::chrono::system_clock::to_time_t(now);
    // 提取微秒部分(1秒=1000000微秒,对应6位小数)
    auto micros = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()) % 1000000;

    // 格式化本地时间
    std::tm local_tm = *std::localtime(&now_sec);
    std::cout << std::put_time(&local_tm, "%Y-%m-%d %H:%M:%S");
    std::cout << "." << std::setw(6) << std::setfill('0') << micros.count() << std::endl;

    // 格式化UTC时间(把localtime换成gmtime即可)
    std::tm gmt_tm = *std::gmtime(&now_sec);
    std::cout << std::put_time(&gmt_tm, "%Y-%m-%d %H:%M:%S");
    std::cout << "." << std::setw(6) << std::setfill('0') << micros.count() << std::endl;

    return 0;
}

代码说明:

  • std::chrono::system_clock::now():获取系统时钟的高精度时间点,包含微秒级精度
  • std::put_time:C++11新增的格式化函数,用%Y-%m-%d %H:%M:%S直接生成你需要的日期时间格式
  • std::setw(6) + std::setfill('0'):确保微秒部分固定为6位,不足时前面补0(比如微秒是123会变成000123

方法二:C++20及以上版本(更简洁)

如果你用的是支持C++20的编译器,可以用<format>库实现更简洁的代码:

#include <iostream>
#include <chrono>
#include <format>

int main() {
    auto now = std::chrono::system_clock::now();
    auto micros = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()) % 1000000;

    // 输出本地时间
    std::cout << std::format("{:%Y-%m-%d %H:%M:%S}", std::chrono::current_zone()->to_local(now));
    std::cout << "." << std::format("{:06d}", micros.count()) << "\n";

    // 输出UTC时间
    std::cout << std::format("{:%Y-%m-%d %H:%M:%S}", std::chrono::utc_time{now});
    std::cout << "." << std::format("{:06d}", micros.count()) << "\n";

    return 0;
}

代码说明:

  • std::format是C++20的新特性,支持直接格式化时间点,代码可读性更高
  • current_zone()->to_local用于转换为本地时区时间,utc_time直接获取UTC时间

方法三:C风格(老编译器兼容,POSIX系统)

如果你的编译器不支持C++11,可以用POSIX标准的gettimeofday函数(仅Linux、macOS等POSIX系统可用):

#include <iostream>
#include <ctime>
#include <iomanip>
#include <sys/time.h> // POSIX系统头文件

int main() {
    struct timeval tv;
    gettimeofday(&tv, nullptr);

    // 格式化本地时间
    std::tm local_tm = *std::localtime(&tv.tv_sec);
    std::cout << std::put_time(&local_tm, "%Y-%m-%d %H:%M:%S");
    std::cout << "." << std::setw(6) << std::setfill('0') << tv.tv_usec << std::endl;

    // 格式化UTC时间
    std::tm gmt_tm = *std::gmtime(&tv.tv_sec);
    std::cout << std::put_time(&gmt_tm, "%Y-%m-%d %H:%M:%S");
    std::cout << "." << std::setw(6) << std::setfill('0') << tv.tv_usec << std::endl;

    return 0;
}

Windows系统替代方案:

Windows没有gettimeofday,可以用GetSystemTimePreciseAsFileTime替代:

#include <windows.h>

// 转换FILETIME为秒和微秒
FILETIME ft;
GetSystemTimePreciseAsFileTime(&ft);
ULARGE_INTEGER uli;
uli.LowPart = ft.dwLowDateTime;
uli.HighPart = ft.dwHighDateTime;
time_t sec = (uli.QuadPart - 116444736000000000LL) / 10000000;
long micros = (uli.QuadPart - 116444736000000000LL) % 10000000 / 10;

内容的提问来源于stack exchange,提问作者JJ Jones

火山引擎 最新活动