「時間範圍合法」在 C# 中至少包含:
public bool IsValidRange(DateTime start, DateTime end, out string errorMsg) {
errorMsg = null;
if (start > end) {
errorMsg = "開始時間不能晚於結束時間";
return false;
}
// 業務規則示例 (根據實際需求調整)
if (end > DateTime.Today) {
errorMsg = "結束時間不能晚於今天";
return false;
}
if ((end - start).TotalDays > 365) {
errorMsg = "查詢範圍不能超過 365 天";
return false;
}
if (start < new DateTime(2020, 1, 1)) {
errorMsg = "數據僅保留 2020 年至今";
return false;
}
return true;
}
private void btnQuery_Click(object sender, EventArgs e) {
if (!DateTime.TryParse(txtStart.Text, out var start) ||
!DateTime.TryParse(txtEnd.Text, out var end)) {
MessageBox.Show("日期格式不正確");
return;
}
if (IsValidRange(start, end, out string msg)) {
LoadData(start, end);
} else {
MessageBox.Show(msg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
public class QueryRequestValidator : AbstractValidator {
public QueryRequestValidator() {
RuleFor(x => x.StartTime)
.NotEmpty().WithMessage("開始時間必填")
.LessThanOrEqualTo(x => x.EndTime).WithMessage("開始時間不能晚於結束時間")
.GreaterThanOrEqualTo(new DateTime(2020,1,1)).WithMessage("不支持 2020 年前數據");
RuleFor(x => x.EndTime)
.NotEmpty().WithMessage("結束時間必填")
.LessThanOrEqualTo(DateTime.Today).WithMessage("結束時間不能晚於今天");
RuleFor(x => x)
.Must(x => (x.EndTime - x.StartTime).TotalDays <= 365)
.WithMessage("查詢範圍不能超過 365 天");
}
}
C# 中 DateTime 直接支持比較運算符 (<, >, <=, >=),無需轉換毫秒數。驗證邏輯核心是 基礎邏輯 + 業務規則,建議使用驗證框架集中管理,避免分散在各事件處理器中。