如何格式化系统时间?

Hui Liu-MSFT 48,711 信誉分 Microsoft 外部员工
2024-02-29T06:35:45.4033333+00:00

我正在尝试使用 std::format 来格式化系统时间的字符串(例如 1/3/2022)

SYSTEMTIME t;  
const auto today=format("today is: {}", t);  

但是,编译时出现错误: 178696-image.png 请告诉我如何让它工作。
我搜索了带有日期时间的 std::format 示例,但没有找到。 Note:此问题总结整理于:How to format systemtime?

开发人员技术 | C++
开发人员技术 | C++

一种通用的高级编程语言,作为 C 编程语言的扩展而创建,除了用于低级别内存操作的功能外,还具有面向对象、泛型和功能性等特点。

0 个注释 无注释

问题作者接受的答案
  1. 匿名
    2024-02-29T07:20:24.9366667+00:00

    你好,

    出现这个错误的原因是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
    

    enter image description here


    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(&lt);  
          
        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
    

    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。

    注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。

    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助

你的答案

提问者可以将答案标记为“已接受”,审查方可以将答案标记为“已推荐”,这有助于用户了解答案是否解决了提问者的问题。