我必须比较两个日期。
我使用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
的错误消息,我不知道为什么。
答案 0 :(得分:0)
StrToDate()
根据ShortDateFormat
单元中的全局DateSeparator
和SysUtils
格式变量指定的格式解析输入字符串。这些变量在应用启动时初始化为操作系统的当前用户区域设置。这是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;
}