首页 > 解决方案 > 如何在 C++Builder 中比较两个日期。1 个来自 MaskEdit 的日期,2 个来自 Date() 的日期

问题描述

我必须比较两个日期。

我从带有掩码的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,我不知道为什么。

标签: datec++builder-6

解决方案


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

很明显,您传递给的输入字符串之一与StrToDate()您的操作系统用于日期的格式不匹配,这就是您收到错误的原因。

要执行您正在尝试的操作,您必须更新这些格式化变量以匹配您的输入使用的格式(因为在 BCB6 中尚不存在StrToDate()将 a作为输入的重载版本)。TFormatSettings而且绝对没有理由将 a TDatefromDate()转换为 String,然后将其解析回 a 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)Editfor 日期输入。一个更安全的选择是改用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;
}

推荐阅读