【问题标题】:Using Preprocessor DATE dynamically动态使用预处理器 DATE
【发布时间】:2020-08-05 15:24:16
【问题描述】:

我正在尝试在 C++Builder 中使用__DATE__,我需要动态使用它。例如,如果用户点击一个按钮,包含__DATE__ 的标签将在系统日期之后更新。

我现在这样做了:

label1->Text = "Data: " __DATE__;

这是一个设置日期的函数,称为DateTime()。对于按钮,我已经完成了点击事件,但我需要 DateTime() 动态运行。

【问题讨论】:

    标签: c++ c++builder rad-studio


    【解决方案1】:

    __DATE__ 是一个编译时常量。这是.cpp 文件的编译日期。在这种情况下,这不是您想要的。

    C++Builder 的 RTL 有一个 Sysutils::Date() 函数,您可以使用它来代替,例如:

    #include <System.SysUtils.hpp>
    
    label1->Text = _T("Data: ") + Date().DateString();
    

    Date() 返回代表当前系统日期的TDateTime(如果您还想包含时间,请改用Sysutils::Now())。它的DateString() 方法使用用户的区域设置将TDateTime 格式化为String。如果你想自己格式化TDateTime,你可以使用它的FormatString()方法,例如:

    #include <System.SysUtils.hpp>
    
    label1->Text = _T("Data: ") + Date().FormatString(_T("yyyy-mm-dd"));
    or:
    label1->Text = Date().FormatString(_T("'Data: 'yyyy-mm-dd"));
    

    如果您想要更标准的 C++ 解决方案,请查看 std::time()std:::strftime() 函数,例如:

    #include <ctime>
    
    std::time_t now_c = std::time(nullptr);
    std::tm now_tm = *std::localtime(&now_c);
    
    char buffer[11] = {};
    std::strftime(buffer, sizeof(buffer), "%Y-%m-%d", &now_tm);
        
    label1->Text = _T("Data: ") + String(buffer);
    or:
    label1->Text = String().sprintf(_T("Data: %s"), buffer);
    

    或者,看看C++11中引入的&lt;chrono&gt;库,比如std::chrono::system_clock,例如:

    #include <chrono>
    #include <ctime>
    
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
    std::time_t now_c = std::chrono::system_clock::to_time_t(now);
    std::tm now_tm = *std::localtime(&now_c);
    
    char buffer[11] = {};
    std::strftime(buffer, sizeof(buffer), "%Y-%m-%d", &now_tm);
        
    label1->Text = _T("Data: ") + String(buffer);
    or:
    label1->Text = String().sprintf(_T("Data: %s"), buffer);
    

    或者:

    #include <chrono>
    #include <ctime>
    #include <sstream>
    #include <iomanip>
    
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
    std::time_t now_c = std::chrono::system_clock::to_time_t(now);
    std::tm now_tm = *std::localtime(&now_c);
    
    std::wostringstream oss;
    oss << L"Data: " << std::put_time(&now_tm, L"%Y-%m-%d");
    
    label1->Text = oss.str().c_str();
    

    【讨论】:

      【解决方案2】:

      __DATE__ symbol is a pre-processor macro,因此它只在编译时定义。

      这意味着__DATE__ 的实际值在程序执行期间不会改变。这将是您的编译时间。在您刚刚编译的可执行文件中永远保持相同的值。

      如果您需要反映当前系统时钟/日期的日期字符串,那么您将需要使用一些函数来查询系统的当前时间,如time()。绝对不是像__DATE__ 这样的编译时预处理器宏字符串。请参阅其他 ctime 函数以帮助您格式化所需的字符串。

      最后,关于构建字符串:您需要像sprintf 那样在运行时编写字符串。您的构造 "Data: " __DATE__ 只是有效的,因为您再次将字符串连接为编译时间(它是编译器预处理器进行连接的那个,而不是您的程序)。 Here 您可以阅读有关 C 预处理器的此功能的信息。此外,here 被描述为这是 C99 标准行为,但无法判断它是否未在早期 C 标准中定义。

      【讨论】:

        猜你喜欢
        • 2021-12-29
        • 2013-05-21
        • 2016-09-02
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        • 1970-01-01
        • 1970-01-01
        • 2012-02-28
        相关资源
        最近更新 更多