JsonStatham
JsonStatham

Reputation: 10384

Change the date part of a DateTime property before database record created

I have a view model in which I am storing a DateTime but in my view using a JQUERY datetimepicker, time only:

ViewModel

[DataType(DataType.Time)]
public DateTime? MondayFrom { get; set; }
[DataType(DataType.Time)]
public DateTime? MondayTo { get; set; }

As it stands, when the Create method gets called it is using todays date plus the time selected from the timepicker.

As I am not particularly concerned with the Date part of the DateTime, I want to change the day, month & year to 01/01/1900 or something less specific than the date the record was written, before the record is created, this is purely to avoid any confusion in the future.

I don't want to get bogged down on whether this is the right thing to do or not.

I'm struggling to get a handle on the Date part of the DateTime, see below:

 public void CreateClub(Club club)
        {
            foreach (var item in club.MeetingDays)
            {
                // change Date part to 01/01/1900, leave the time as is..
            }
            _repository.CreateClub(club);
        }

How might I floor the date part of the item but leave the time well alone?

Upvotes: 0

Views: 126

Answers (2)

D Stanley
D Stanley

Reputation: 152644

DateTime is immutable - you cant just change part of it. You can extract the time and add it to a "base" date:

for(int i=0; i < club.MeetingDays.Count; i++)
{
    club.MeetingDays[i] = new DateTime(1900, 1, 1) + club.MeetingDays[i].TimeOfDay;
}

Note that you need a for loop so you can place the new value back in the collection. You could also use Linq:

club.MeetingDays = club.MeetingDays
                       .Select(t => new DateTime(1900, 1, 1) + t.TimeOfDay)
                       .ToList();

Assuming that club.MeetingDays is a List<Datetime>

Upvotes: 0

Jon Skeet
Jon Skeet

Reputation: 1503964

Just use the TimeOfDay property to extract the time within the day, and add that to the date you want:

private static readonly DateTime BaseDate = new DateTime(1900, 1, 1);

var updatedDateTime = BaseDate + otherDateTime.TimeOfDay;

You could even write an extension method or two:

public static DateTime WithDate(this DateTime start, DateTime date)
{
    // No need to use the Date property if you already know
    // it will be midnight...
    return date.Date + start.TimeOfDay;
}

public static DateTime WithFloorDate(this DateTime start)
{
    return start.WithDate(FloorDate);
}

Of course, I'd suggest you use Noda Time where you can specify dates, times and date/time values (with or without a time zone or UTC offset0 separately, but that's a different conversation.

Upvotes: 6

Related Questions