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
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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...
Method 2
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.
Method 3
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);
Method 4
Have you tried this:
var yesterday = System.DateTime.Now.Date.Subtract(new TimeSpan(1, 0, 0, 0))
Method 5
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.
Method 6
// 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);
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0