BCB6 C ++如何比较两个日期。 MaskEdit中的1个日期Date()中的2个日期

时间:2019-03-07 20:30:32

标签: date c++builder-6

我必须比较两个日期。

我使用TMaskEdit掩码从DD-MM-YYYY组件中获得了第一个。

我从Date()函数获得第二个日期。

我尝试过这样的事情:

String MaskEditDate = me3->Text.Trim();
String ActualDate = Date().FormatString("DD-MM-YYYY");

TDate TDMaskEditDate = StrToDate(MaskEditDate);
TDate TDActualDate = StrToDate(ActualDate);

if (TDMaskEditDate > TDActualDate)
{
    ShowMessage("TDMaskEditDate > TDActualDate");
}
if (TDMaskEditDate == TDActualDate)
{
    ShowMessage("TDMaskEditDate == TDActualDate");
}
if (TDMaskEditDate < TDActualDate)
{
    ShowMessage("TDMaskEditDate < TDActualDate");
}

但是,当我尝试将字符串转换为日期时,出现类似'2000-01-01' is not a valid date的错误消息,我不知道为什么。

1 个答案:

答案 0 :(得分:0)

StrToDate()根据ShortDateFormat单元中的全局DateSeparatorSysUtils格式变量指定的格式解析输入字符串。这些变量在应用启动时初始化为操作系统的当前用户区域设置。这是BCB帮助文件中记录的行为。

很明显,您传递给StrToDate()的输入字符串之一与操作系统用于日期的格式不匹配,这就是为什么会出现错误。

要尝试执行的操作,必须更新这些格式设置变量以匹配输入所使用的格式(因为不存在需要StrToDate()作为输入的TFormatSettings的重载版本)但在BCB6中)。而且绝对没有理由从TDate中提取Date(),将其转换为字符串,然后将其解析回TDate,这是多余的。

尝试以下方法:

String MaskEditDate = me3->Text.Trim();
TDate TDActualDate = Date();

String oldShortDateFormat = ShortDateFormat;
Char oldDateSeparator = DateSeparator;
ShortDateFormat = "DD-MM-YYYY";
DateSeparator = '-';

TDate TDMaskEditDate = StrToDate(MaskEditDate);

ShortDateFormat = oldShortDateFormat;
DateSeparator = oldDateSeparator;

但是,您实际上不应该使用T(Mask)Edit来输入日期。一个更安全的选择是使用TDateTimePicker控件。将其Kind属性设置为dtkDate,然后在需要时读取其Date属性。完全不需要使用字符串来处理日期值:

TDate TDDateTimePickerDate = DateTimePicker1->Date;
TDate TDActualDate = Date();

if (TDDateTimePickerDate > TDActualDate)
{
    ShowMessage("TDDateTimePickerDate > TDActualDate");
}
else if (TDDateTimePickerDate == TDActualDate)
{
    ShowMessage("TDDateTimePickerDate == TDActualDate");
}
else //if (TDDateTimePickerDate < TDActualDate)
{
    ShowMessage("TDDateTimePickerDate < TDActualDate");
}

或者:

#include <DateUtils.hpp>

TDate TDDateTimePickerDate = DateTimePicker1->Date;
TDate TDActualDate = Date();

switch (CompareDate(TDDateTimePickerDate, TDActualDate))
{
    case GreaterThanValue:
        ShowMessage("TDDateTimePickerDate > TDActualDate");
        break;

    case EqualsValue:
        ShowMessage("TDDateTimePickerDate == TDActualDate");
        break;

    case LessThanValue:
        ShowMessage("TDDateTimePickerDate < TDActualDate");
        break;
}