Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get previous day using datetime

Tags:

I want to set a DateTime property to the previous day at time 00:00:00. I've tried using DateTime.AddDays(-1) and DateTime.AddTicks(-1) and they aren't working. Is this the right way to do it?

I have 2 objects. Each object has two DateTime fields: ValidFrom and ValidTo.

EDIT: After coming home from work I tried to get the same behavior as my business objects. The code I used to try and replicate how it functions at work is below. Of course this is working at home but not at work. The good thing is I got good answers and +1 on all! =)

public class RuleValue {     public DateTime ValidFrom, ValidTo;          public RuleValue(DateTime _validFrom, DateTime _validTo)     {         ValidFrom = _validFrom;         ValidTo = _validTo;     }      // oldObject.ValidFrom = 1900-01-01     // oldObject.ValidTo = 9999-12-31      // newObject.ValidFrom = 2010-03-22     // newObject.ValidTo = 9999-12-31     public void ChangeOldDate(RuleValue oldObject, RuleValue newObject)     {         /*           * 1: When first object (oldObject) have ValidTo set to SQL-server maxdate (9999-12-12 23:59:59 etc)          *    I want to allow for a new object to be created          * 2: oldObject timespan ValidFrom-ValidTo should not be overlapping with newObjects timespan(i have checks for that)          * 3: oldObject.ValidTo should be newObject.ValidFrom - one day/or one tick          */          if (oldObject.ValidTo == DateTime.MaxValue)         {             oldObject.ValidTo = newObject.ValidFrom.AddTicks(-1); //now works         }      } }  class Program {     static void Main(string[] args)     {         RuleValue rv1 = new RuleValue(DateTime.Parse("1900-01-01"), DateTime.MaxValue);         RuleValue rv2 = new RuleValue(DateTime.Parse("2010-03-22"), DateTime.MaxValue);          Console.WriteLine("First: ");         Console.WriteLine("Old = " + rv1.ValidFrom + " - " + rv1.ValidTo);         Console.WriteLine("New = " + rv2.ValidFrom + " - " + rv2.ValidTo);                  rv1.ChangeOldDate(rv1, rv2);          Console.WriteLine("After: ");         Console.WriteLine("Old = " + rv1.ValidFrom + " - " + rv1.ValidTo);         Console.WriteLine("New = " + rv2.ValidFrom + " - " + rv2.ValidTo);          Console.ReadKey();     } } //Output: //First: //Old = 1900-01-01 00:00:00 - 9999-12-31 23:59:59 //New = 2010-03-22 00:00:00 - 9999-12-31 23:59:59 //After: //Old = 1900-01-01 00:00:00 - 2010-03-21 23:59:59 //New = 2010-03-22 00:00:00 - 9999-12-31 23:59:59 //  ALL CORRECT! :D 
like image 623
Niike2 Avatar asked Mar 22 '10 16:03

Niike2


People also ask

How do you get the day before a datetime?

<DateTime>. Date. AddDays(-1); This will strip off the time and give you midnight the previous day.


1 Answers

DateTime is an immutable struct. When you call AddDays() or AddTicks() it returns a new instance of a DateTime, it does NOT modify the instance you called it on. Make sure you assign the result to a variable or there is no visible change in your code:

DateTime d1 = DateTime.Now; d1 = d1.AddDays(-1); // assign back to see the new instance 

If you need to reset the time portion of the date to midnight, you will need to use an explicit constructor call:

DateTime d1 = DateTime.Now; DateTime d2 = new DateTime( d1.Year, d1.Month, d1.Day, 0, 0, 0 ); DateTime d3 = d1.Date; // a simpler alternative to the above... 
like image 189
LBushkin Avatar answered Oct 12 '22 18:10

LBushkin