开发人员技术 | C++
一种通用的高级编程语言,作为 C 编程语言的扩展而创建,除了用于低级别内存操作的功能外,还具有面向对象、泛型和功能性等特点。
我正在尝试使用 std::format 来格式化系统时间的字符串(例如 1/3/2022)
SYSTEMTIME t;
const auto today=format("today is: {}", t);
但是,编译时出现错误:
请告诉我如何让它工作。
我搜索了带有日期时间的 std::format 示例,但没有找到。
Note:此问题总结整理于:How to format systemtime?
一种通用的高级编程语言,作为 C 编程语言的扩展而创建,除了用于低级别内存操作的功能外,还具有面向对象、泛型和功能性等特点。
问题作者接受的答案
你好,
出现这个错误的原因是SYSTEMTIME是一个结构体,不能直接使用format,所以需要将SYSTEMTIME转为字符串,示例代码如下: (为了运行以下代码,您需要参考此链接中的方法来关闭4996警告。)
#include <windows.h>
#include <atlstr.h>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <format>
int main()
{
SYSTEMTIME st, lt;
GetSystemTime(&st);
std::string strMessage;
CString cstrMessage;
cstrMessage.Format(_T("%d-%02d-%02d %02d:%02d:%02d.%03d"),
st.wYear,
st.wMonth,
st.wDay,
st.wHour,
st.wMinute,
st.wSecond,
st.wMilliseconds);
strMessage = CT2A(cstrMessage.GetString());
std::cout << "System time = " << strMessage << std::endl;
std::ostringstream ossMessage;
ossMessage << st.wYear << "-"
<< std::setw(2) << std::setfill('0') << st.wMonth << "-"
<< std::setw(2) << std::setfill('0') << st.wDay << " "
<< std::setw(2) << std::setfill('0') << st.wHour << ":"
<< std::setw(2) << std::setfill('0') << st.wMinute << ":"
<< std::setw(2) << std::setfill('0') << st.wSecond << "."
<< std::setw(3) << std::setfill('0') << st.wMilliseconds;
strMessage = ossMessage.str();
std::cout << "System time = " << strMessage << std::endl;
char buffer[256];
sprintf(buffer,
"%d-%02d-%02d %02d:%02d:%02d.%03d",
st.wYear,
st.wMonth,
st.wDay,
st.wHour,
st.wMinute,
st.wSecond,
st.wMilliseconds);
strMessage = buffer;
std::cout << "System time = " << strMessage << std::endl;
const auto today = std::format("today is: {}", strMessage);
return 0;
}
您还可以一一使用 SYSTEMTIME 中的成员,例如:
const auto today = format("today is: {}/{}/{}", t.wDay,t.wMonth,t.wYear);//e.g. 1/3/2022
OP Updated:
有什么方法可以写出这样的代码吗?
format("today is: {%d-%m-%y}",value);
因为我不知道使用 std::format 的值的 suit 数据类型是什么。
在我的代码中 %d-%m-%y 不起作用,但我的意思是,我可以在大括号中按字符串格式化值。
最简单的方法就是像下面的代码一样执行程序,这样可以满足您的需求吗?
#include <windows.h>
#include<iostream>
#include<vector>
#include <format>
using namespace std;
int main()
{
SYSTEMTIME st, lt;
GetLocalTime(<);
const auto today = format("today is: {}-{}-{}", lt.wDay, lt.wMonth, lt.wYear);
cout << today;
return 0;
}
其输出格式可以参考这个示例:
#include <format>
#include <iostream>
#include <string>
#include <string_view>
template <typename... Args>
std::string dyna_print(std::string_view rt_fmt_str, Args&&... args) {
return std::vformat(rt_fmt_str, std::make_format_args(args...));
}
int main() {
std::cout << std::format("Hello {}!\n", "world");
std::string fmt;
for (int i{}; i != 3; ++i) {
fmt += "{} "; // constructs the formatting string
std::cout << fmt << " : ";
std::cout << dyna_print(fmt, "alpha", 'Z', 3.14, "unused");
std::cout << '\n';
}
}
output:
Hello world!
{} : alpha
{} {} : alpha Z
{} {} {} : alpha Z 3.14
如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。
注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。