BCB6 C ++, как сравнить две даты.1 дата от MaskEdit 2 дата от даты () - PullRequest
0 голосов
/ 07 марта 2019

Мне нужно сравнить две даты.

Первая, полученная из компонента 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 голосов
/ 08 марта 2019

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;
}
...