Как получить предыдущий день, используя datetime - PullRequest
19 голосов
/ 22 марта 2010

Я хочу установить свойство DateTime на предыдущий день в 00:00:00. Я не знаю, почему DateTime.AddDays (-1) не работает. Или почему DateTime.AddTicks (-1) не работает. Сначала это должно работать?

У меня есть 2 объекта. Каждый объект имеет поля DateTime ValidFrom, ValidTo.

РЕДАКТИРОВАТЬ: После возвращения с работы я пытался вести себя так же, как ведут себя мои бизнес-объекты. Ниже приведен код, который я пытался повторить, как он выглядит на работе. Конечно, это работает дома, но не на работе. Хорошо, что я получил хорошие ответы и +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

Ответы [ 6 ]

55 голосов
/ 22 марта 2010

DateTime является неизменной структурой. Когда вы вызываете AddDays() или AddTicks(), он возвращает новый экземпляр DateTime , он НЕ изменяет экземпляр, на который вы его вызвали. Убедитесь, что вы присваиваете результат переменной, или в вашем коде нет видимых изменений:

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

Если вам нужно сбросить временную часть даты на полночь, вам нужно будет использовать явный вызов конструктора:

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...
13 голосов
/ 22 марта 2010

самый простой способ это ..

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

Теперь, если вы пытаетесь использовать переменную, которая уже была создана, вы бы сделали это ...

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

Возможно, размещение вашего кода покажет нам, что вы делаете неправильно.

6 голосов
/ 22 марта 2010

Возможно, ваша проблема в том, что AddDays не изменяет объект, а возвращает DateTime с измененными днями. Так и должно быть:

DateTime Yesterday = CurrentDay.AddDays(-1);
4 голосов
/ 22 марта 2010

Вы пробовали это:

var yesterday = System.DateTime.Now.Date.Subtract(new TimeSpan(1, 0, 0, 0))
4 голосов
/ 22 марта 2010

Попробуйте:

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

Это лишит вас времени и даст вам полночь предыдущего дня.

EDIT: Да, извините, я хотел указать, что «DateTime» означает рассматриваемую переменную. Я добавил скобки вокруг него.

0 голосов
/ 26 июня 2013

// получаем день лат текущего месяца

DateTime newDate= new DateTime();
var LastDay2 =  newDate.AddMonths(1);
var LastDay3 = LastDay2.Day * (-1);
var d5 = LastDay2.AddDays(LastDay3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...