c# - 如何使用日期时间获取前一天

标签 c# .net asp.net datetime

我想将 DateTime 属性设置为前一天的 00:00:00。我试过使用 DateTime.AddDays(-1)DateTime.AddTicks(-1) 但它们不起作用。这是正确的做法吗?

我有 2 个对象。每个对象都有两个 DateTime 字段:ValidFromValidTo

编辑:下类回家后,我试图获得与我的业务对象相同的行为。下面是我用来尝试复制其工作方式的代码。当然这是在家里工作而不是在工作中。好消息是我得到了很好的答案并且全部+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

最佳答案

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

关于c# - 如何使用日期时间获取前一天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2493724/

相关文章:

c# - TryTake 与 GetConsumingEnumerable

c# - 字段和属性有什么区别?

c# - 是否选中了两个或三个单选按钮中的任何一个

c# - 创建一个完成的 Task<T>

.net - 跨 AppDomains 和进程的 TransactionScope

javascript - 备注字段(客户端和服务器端)的正则表达式验证很少有特殊标签

asp.net - 为 "Forgotten Password"编写代码的最佳方法

c# - 服务层和存储库

c# - 是否可以从 PropertyGrid 中隐藏枚举值?

asp.net - 将值传递给 Sql 中的空值列