date - 如何在 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
,我不知道为什么。
解决方案
StrToDate()
ShortDateFormat
根据单元中的全局和DateSeparator
格式化变量指定的格式解析输入字符串SysUtils
。这些变量在应用程序启动时初始化为您操作系统的当前用户区域设置。这是 BCB 帮助文件中记录的行为。
很明显,您传递给的输入字符串之一与StrToDate()
您的操作系统用于日期的格式不匹配,这就是您收到错误的原因。
要执行您正在尝试的操作,您必须更新这些格式化变量以匹配您的输入使用的格式(因为在 BCB6 中尚不存在StrToDate()
将 a作为输入的重载版本)。TFormatSettings
而且绝对没有理由将 a TDate
fromDate()
转换为 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)Edit
for 日期输入。一个更安全的选择是改用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;
}
推荐阅读
- angular - 通过表单控件从父级获取验证器
- stackexchange-api - SEDE 中的结果计数与 Stack Exchange 的 API 不匹配
- python - 如何在不结束python中的for循环的情况下使用return?
- ios - 使用圆形按钮自定义标签栏问题 swift
- php - 检查元素是否存在于数组中,如果条件 PHP 则返回
- javascript - 让机器人对自己的消息做出反应
- shell - 以表格格式排列数据
- android - Facebook 受众网络广告(奖励、横幅、插页式广告)未在发布模式下显示
- codeigniter - CI 4项目公用文件夹内的NULL文件夹
- android - 被拒绝的应用 Google Play 上没有适用于 Android TV 的全尺寸应用横幅