views:

1038

answers:

5

How can I convert a number between 1 and 7 into a DateTime object in C# which represents the day of the week? The numbers are coming from a XML file which I am parsing. I am retrieving each instance of a field containing a number between 1 and 7 which represents a day of the week between Sunday and Saturday.

A: 

In order to get a DateTime, you'd need a specific range of dates that you want the weekday to fall under (since a DateTime is a specific date and time, and a weekday isn't).

There is a DayOfWeek enumeration (whose values actually range from 0-6). If all you need is something to represent the day of the week, then you should be able to cast your int to a DayOfWeek like..

DayOfWeek myDay = (DayOfWeek)yourInt;

If you need an actual DateTime, you'll need a start date. You could then do...

DateTime myDate = startDate.AddDays(
    (int)startDate.DayOfWeek >= yourInt ? 
        (int)startDate.DayOfWeek - yourInt : 
        (int)startDate.DayOfWeek - yourInt + 7);

This will give you a DateTime for the next occuring instance of the day of the week you're describing.

Adam Robinson
+1  A: 

A DateTime instance represents alway a complete date and cannot only represent a day of the week. If the actual date does not matter, take any monday (assuming 0 represents monday) and just add the number of the day.

Int32 dayOfWeek = 3;

// date represents a thursday since 2009/04/20 is a monday
DateTime date = new DateTime(2009, 04, 20).AddDays(dayOfWeek);

Else I agree with Adam Robinson's answer - if you just want to hold the day of a week, stick with the DayOfWeek enum (zero is sunday) instead of using an integer.

Daniel Brückner
+1  A: 

DayOfWeek.Sunday is zero, so you could start with an arbitrary fixed date that you know to be Sunday, and add a value between 0 and 6:

public DateTime GetDayOfWeek(int dayOfWeek)
{
    if (dayOfWeek < 0 || dayOfWeek > 6) throw new ArgumentOutOfRangeException(...);

    // 4 January 2009 was a Sunday
    return new DateTime(2009,1,4).AddDays(dayOfWeek);
}

I'm not sure why you would want this though.

If you only want it to get a localized version of the day of the week as in:

GetDayOfWeek(3).ToString("dddd"); // Gets name of day of week for current culture

an alternative would be to use DateTimeFormatInfo.DayNames or DateTimeFormatInfo.AbbreviatedDayNames for the culture you want.

Joe
+1  A: 

I would assume casting to a DayOfWeek object would give you a day of the week

DayOfWeek day = (DayOfWeek)myInt;

As far as a DateTime object goes, the object represents a specific day, not necessarily a random day of the week. You may try adding a # of days to a specific date if this is what you're trying to achieve.

http://msdn.microsoft.com/en-us/library/system.dayofweek.aspx

Will Eddins