0

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

我现在这样做了:

label1->Text = "Data: " __DATE__;

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

4

2 回答 2

0

__DATE__符号是一个预处理器宏,因此它只在编译时定义。

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

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

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

于 2020-08-05T15:50:55.020 回答
0

__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();
于 2020-08-05T15:52:45.680 回答