如何用C++输出带毫秒的指定格式当前日期时间?
解决带毫秒/微秒的日期时间格式化问题
嘿,我来帮你搞定这个时间格式化的需求!你当前用的ctime和asctime确实做不到毫秒级别的精度输出,而且它们的默认格式也不符合你想要的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




