Подтвердить что ты не робот

Как получить предыдущий день с использованием даты и времени

Я хочу установить свойство 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
4b9b3361

Ответ 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);