动态使用预处理器 DATE

Using Preprocessor DATE dynamically

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

我现在这样做了:

label1->Text = "Data: " __DATE__;

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

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

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

如果您需要反映当前系统的日期字符串 clock/date,那么您将需要使用一些查询当前系统的函数,因为 time(). Definitely not a compile-time-pre-processor macro string as __DATE__. See other ctime 函数可以帮助您格式化所需的字符串。

最后,关于构建字符串:您将需要在运行时编写字符串,正如 sprintf does. Your construction "Data: " __DATE__ is just valid because you are again concatenating string as compilation time (it is the compiler pre-processor the one doing the concatenation, no your program). Here you can read about this capability of the C pre-processor. Also,here 描述的那样,这是 C99 标准行为,但无法判断它是否未在早期的 C 标准中定义.

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

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

#include <System.SysUtils.hpp>

label1->Text = _T("Data: ") + Date().DateString();

Date() returns 一个 TDateTime representing the current system date (if you want to include time as well, use Sysutils::Now() instead). Its DateString() method formats the TDateTime into a String using the user's locale settings. If you want to format the TDateTime yourself, you can use its 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() and 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);

或者,查看<chrono> library introduced in C++11, such as 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();