【问题标题】:How to get previous day using datetime如何使用日期时间获取前一天
【发布时间】:2011-01-30 10:13:20
【问题描述】:

我想将 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

【问题讨论】:

  • 我们可以查看您的 DataTime.AddDays(-1) 代码吗?
  • AddDays() 似乎是 Microsoft 特定的,因为文档位于 MSDN 中。可能是 IronPython 的特定功能?它绝对不是标准的 Python datetime,因为它不在 docs.python.org/3/library/datetime.html

标签: c# .net asp.net datetime


【解决方案1】:

试试:

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

这会去掉时间,给你前一天的午夜。

编辑: 是的,抱歉,我的意思是表示“日期时间”是指有问题的变量。我在它周围加了括号。

【讨论】:

  • 应该是DateTime.Now.Date.AddDays(-1);
【解决方案2】:

你试过了吗:

var yesterday = System.DateTime.Now.Date.Subtract(new TimeSpan(1, 0, 0, 0))

【讨论】:

    【解决方案3】:

    最简单的方法是这样..

    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
    

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

    【讨论】:

    • ... 甚至 DateTime.Today.AddDays(-1)
    【解决方案4】:

    也许你的问题是AddDays 没有修改对象,它返回一个日期时间改变的日子。所以应该是:

    DateTime Yesterday = CurrentDay.AddDays(-1);
    

    【讨论】:

    • 作为实际阅读问题的唯一答案的最高点,因为这会将一天中的时间设置为 00:00:00。
    【解决方案5】:

    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...
    

    【讨论】:

    • 您重置到午夜过于复杂 - DateTime d2 = d1.Date 足以剥离时间组件。
    • "DateTime 是一个不可变的结构。" - nuff 说 =D
    【解决方案6】:

    //获取当前月份的Lat Day

    ​​>
    DateTime newDate= new DateTime();
    var LastDay2 =  newDate.AddMonths(1);
    var LastDay3 = LastDay2.Day * (-1);
    var d5 = LastDay2.AddDays(LastDay3);
    

    【讨论】:

    • 这根本不回答问题
    猜你喜欢
    • 2010-12-14
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    相关资源
    最近更新 更多