我正在尝试__DATE__
在 C++Builder 中使用,我需要动态使用它。例如,如果用户单击一个按钮,包含的标签__DATE__
将在系统日期之后更新。
我现在这样做了:
label1->Text = "Data: " __DATE__;
这是一个设置日期的函数,称为DateTime()
. 对于按钮,我已经做了点击事件,但我需要DateTime()
动态运行。
我正在尝试__DATE__
在 C++Builder 中使用,我需要动态使用它。例如,如果用户单击一个按钮,包含的标签__DATE__
将在系统日期之后更新。
我现在这样做了:
label1->Text = "Data: " __DATE__;
这是一个设置日期的函数,称为DateTime()
. 对于按钮,我已经做了点击事件,但我需要DateTime()
动态运行。
该__DATE__
符号是一个预处理器宏,因此它只在编译时定义。
这意味着 的实际值__DATE__
在程序执行期间不会改变。这将是您的编译时间。永远与您刚刚编译的可执行文件中的值相同。
如果您需要反映当前系统时钟/日期的日期字符串,那么您将需要使用一些查询系统当前的函数,如time()
. 绝对不是编译时预处理器宏字符串作为__DATE__
. 请参阅其他ctime函数以帮助您格式化所需的字符串。
最后,关于构建字符串:您将需要像在运行时一样编写字符串sprintf
。您的构造"Data: " __DATE__
是有效的,因为您再次将字符串连接为编译时间(它是编译器预处理器进行连接,而不是您的程序)。在这里,您可以了解 C 预处理器的此功能。此外,这里描述了这是一个 C99 标准行为,但无法判断它是否未在早期的 C 标准中定义。
__DATE__
是编译时常量。它.cpp
是编译文件的日期。在这种情况下,这不是您想要的。
C++Builder 的 RTL 有一个Sysutils::Date()
你可以使用的函数,例如:
#include <System.SysUtils.hpp>
label1->Text = _T("Data: ") + Date().DateString();
Date()
返回一个TDateTime
表示当前系统日期的值(如果您还想包含时间,请Sysutils::Now()
改用)。它的方法使用用户的区域设置将其DateString()
格式化TDateTime
为 a 。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()
andstd:::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>
C++11中引入的库,比如std::chrono::system_clock
,eg:
#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();