Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Constant DateTime in C#

As some of the earlier responses note, a const DateTime is not natively supported in C# and can't be used as an attribute parameter. Nevertheless, a readonly DateTime (which is recommended over const in Effective C#, 2nd edition [Item 2]) is a simple workaround for other situations as follows:

public class MyClass
{
    public static readonly DateTime DefaultDate = new DateTime(1900,1,1);
}

The solution I've always read about is to either go the route of a string, or pass in the day/month/year as three separate parameters, as C# does not currently support a DateTime literal value.

Here is a simple example that will let you pass in either three parameters of type int, or a string into the attribute:

public class SomeDateTimeAttribute : Attribute
{
    private DateTime _date;

    public SomeDateTimeAttribute(int year, int month, int day)
    {
        _date = new DateTime(year, month, day);
    }

    public SomeDateTimeAttribute(string date)
    {
        _date = DateTime.Parse(date);
    }

    public DateTime Date
    {
        get { return _date; }
    }

    public bool IsAfterToday()
    {
        return this.Date > DateTime.Today;
    }
}

The DateTimeRangeValidator can take a string representation (ISO8601 format) as a parameter

e.g

                            LowerBound              UpperBound
[DateTimeRangeValidator("2010-01-01T00:00:00",  "2010-01-20T00:00:00")]

A single parameter will get interpreted as an UpperBound so you need 2 if you want to enter a LowerBound. Check the docs to see if there is a special 'do not care' value for UpperBound or if you need to set it to a very far future date.

Whoops, just re-read and noticed

'Going this way is not preferable'

[DateTimeRangeValidator("01-01-2011")]

Why not?

Would

private const string LowerBound = "2010-01-01T00:00:00";
private const string UpperBound = "2010-01-20T00:00:00";

[DateTimeRangeValidator(LowerBound, UpperBound)]

be any worse/different than (VB date literal format)

private const DateTime LowerBound = #01/01/2000 00:00 AM#;
private const DateTime UpperBound = #20/01/2000 11:59 PM#;

[DateTimeRangeValidator(LowerBound, UpperBound)]

hth,
Alan