'How to get previous day using datetime

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


Solution 1:[1]

the easiest way is this..

DateTime yesterday = DateTime.Now.Date.AddDays(-1);

now if you are trying to use a variable that has already been created, you would do this...

DateTime yesterday = DateTime.Now;  // will give you today's date
yesterday = yesterday.Date.AddDays(-1); // will give you yesterday's date at 12:00 AM

Possibly posting your code will show us what you are doing wrong.

Solution 2:[2]

Maybe your problem is AddDays doesn't modify the object, it returns an DateTime with the changed days. So it should be:

DateTime Yesterday = CurrentDay.AddDays(-1);

Solution 3:[3]

Have you tried this:

var yesterday = System.DateTime.Now.Date.Subtract(new TimeSpan(1, 0, 0, 0))

Solution 4:[4]

Try:

<DateTime>.Date.AddDays(-1);

This will strip off the time and give you midnight the previous day.

EDIT: Yes sorry, I meant to put some sort of indication that "DateTime" meant the variable in question. I added brackets around it.

Solution 5:[5]

// get Lat Day Of Current Month

DateTime newDate= new DateTime();
var LastDay2 =  newDate.AddMonths(1);
var LastDay3 = LastDay2.Day * (-1);
var d5 = LastDay2.AddDays(LastDay3);

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Ryan Alford
Solution 2 Keltex
Solution 3
Solution 4
Solution 5 Hossein