You can use string and RegularExpression
public class DataParameter
{
[RegularExpression(@"^\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$", ErrorMessage = "Date should be in YYYY-MM-DD format")]
public string StartDate { get; set; }
[RegularExpression(@"^\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$", ErrorMessage = "Date should be in YYYY-MM-DD format")]
public string EndDate { get; set; }
}
The regex is from here
Or create your own attribute, something like this
public class DateFormatAttribute : ValidationAttribute
{
private readonly string _format;
public DateFormatAttribute(string format)
: base($"Date should be in {format} format.")
{
_format = format;
}
public override bool IsValid(object value)
{
if (value is not string dateStr)
{
return false;
}
return DateTime.TryParseExact(dateStr, _format, CultureInfo.InvariantCulture, DateTimeStyles.None, out _);
}
}
Then use it as follows
[DateFormat("yyyy-MM-dd")]
public string StartDate { get; set; }
FluentValidation implementation
RuleFor(c => c.StartDate)
.Must(x => DateTime.TryParseExact(x, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out _))
.When(x => !string.IsNullOrWhiteSpace(x.StartDate))
.WithMessage("Date should be in yyyy-MM-dd format");
Note that StartDate and EndDate are strings