如何使用datetime获取前一天

Nii*_*ke2 19 .net c# asp.net datetime

我想在00:00:00将DateTime属性设置为前一天.我不知道为什么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
Run Code Online (Sandbox Code Playgroud)

LBu*_*kin 56

DateTime是一个不可变的结构.当您调用AddDays()AddTicks()返回DateTime新实例时,它不会修改您调用它的实例.确保将结果分配给变量,或者代码中没有明显的变化:

DateTime d1 = DateTime.Now;
d1 = d1.AddDays(-1); // assign back to see the new instance
Run Code Online (Sandbox Code Playgroud)

如果需要将日期的时间部分重置为午夜,则需要使用显式构造函数调用:

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...
Run Code Online (Sandbox Code Playgroud)

  • 您重置为午夜过于复杂 - "DateTime d2 = d1.Date"足以剥离时间组件. (13认同)

Rya*_*ord 13

最简单的方法就是这个..

DateTime yesterday = DateTime.Now.Date.AddDays(-1);
Run Code Online (Sandbox Code Playgroud)

现在,如果您正在尝试使用已创建的变量,那么您将执行此操作...

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
Run Code Online (Sandbox Code Playgroud)

可能发布您的代码将告诉我们您做错了什么.

  • ......甚至DateTime.Today.AddDays(-1) (2认同)

Kel*_*tex 6

也许您的问题是AddDays不修改对象,它返回DateTime与更改的天数.所以它应该是:

DateTime Yesterday = CurrentDay.AddDays(-1);
Run Code Online (Sandbox Code Playgroud)


JYe*_*ton 5

尝试:

<DateTime>.Date.AddDays(-1);
Run Code Online (Sandbox Code Playgroud)

这将剥离时间并让您在前一天午夜。

编辑:是的,抱歉,我想表明“DateTime”是指有问题的变量。我在它周围添加了括号。


Enr*_*lio 5

您是否尝试过:

var yesterday = System.DateTime.Now.Date.Subtract(new TimeSpan(1, 0, 0, 0))
Run Code Online (Sandbox Code Playgroud)