Как получить предыдущий день с использованием даты и времени
Я хочу установить свойство DateTime в предыдущий день в 00:00:00. Я не знаю, почему DateTime.AddDays(-1) не работает. Или почему DateTime.AddTicks(-1) не работает.
Во-первых, если это работает?
У меня есть 2 объекта. Каждый объект имеет поля DateTime ValidFrom, ValidTo.
EDIT: после возвращения с работы я попытался добиться такого же поведения, как и мои бизнес-объекты. Ниже приведен код, который я пытался воспроизвести, как он выглядит на работе. Конечно, это работает дома, но не работает. Хорошо, что у меня есть хорошие ответы и +1 на всех! =)
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
Ответы
Ответ 1
DateTime - неизменяемая структура. Когда вы вызываете AddDays()
или AddTicks()
, он возвращает новый экземпляр DateTime, он НЕ изменяет экземпляр, на который вы его вызвали. Убедитесь, что вы назначили результат переменной или нет видимых изменений в вашем коде:
DateTime d1 = DateTime.Now;
d1 = d1.AddDays(-1); // assign back to see the new instance
Если вам нужно reset часть времени для даты до полуночи, вам нужно будет использовать явный вызов конструктора:
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...
Ответ 2
Самый простой способ - это...
DateTime yesterday = DateTime.Now.Date.AddDays(-1);
теперь, если вы пытаетесь использовать уже созданную переменную, вы сделали бы это...
DateTime yesterday = DateTime.Now; // will give you today date
yesterday = yesterday.Date.AddDays(-1); // will give you yesterday date at 12:00 AM
Возможно, размещение вашего кода покажет нам, что вы делаете неправильно.
Ответ 3
Возможно, ваша проблема AddDays
не изменяет объект, он возвращает DateTime с измененными днями. Поэтому это должно быть:
DateTime Yesterday = CurrentDay.AddDays(-1);
Ответ 4
Try:
<DateTime>.Date.AddDays(-1);
Это отменит время и даст вам полночь в предыдущий день.
EDIT:
Да, извините, я хотел указать какое-то указание на то, что "DateTime" означает переменную, о которой идет речь. Я добавил скобки вокруг него.
Ответ 5
Вы пробовали это:
var yesterday = System.DateTime.Now.Date.Subtract(new TimeSpan(1, 0, 0, 0))
Ответ 6
//получить Lat Day текущего месяца
DateTime newDate= new DateTime();
var LastDay2 = newDate.AddMonths(1);
var LastDay3 = LastDay2.Day * (-1);
var d5 = LastDay2.AddDays(LastDay3);