动态使用预处理器 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();
我正在尝试在 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();