如何使用日期时间获得previous天如何使用、日期、时间、previous

2023-09-03 02:29:17 作者:曲未终,人已散

我想一个DateTime属性,以previous日00:00:00设置。我不知道为什么DateTime.AddDays(-1)无法正常工作。或者为什么DateTime.AddTicks(-1)无法正常工作。 首先应这项工作?

我有2个对象。每个对象有日期时间字段ValidFrom,ValidTo。

编辑:下班回家后,我试图让相同的行为与我的业务对象的行为。下面是code我试图复制它的外观在工作。当然,这是在家里工作,但不是在工作。好在我得到了很好的答案和+1所有! =)

 公共类RuleValue
{
    公开日期时间ValidFrom,ValidTo;

    公共RuleValue(日期时间_validFrom,日期时间_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
    公共无效ChangeOldDate(RuleValue的OLDobject,RuleValue NEWOBJECT)
    {
        / *
         * 1:当第一个对象(的OLDobject)已ValidTo设置为SQL服务器的maxDate(9999-12-12 23时59分59秒等)
         *我想允许为将要创建的新对象
         * 2:的OLDobject时间跨度ValidFrom-ValidTo不应与newObjects入库时间重叠(我有检查的)
         * 3:oldObject.ValidTo应newObject.ValidFrom  - 一天/或一个刻度
         * /

        如果(oldObject.ValidTo == DateTime.MaxValue)
        {
            oldObject.ValidTo = newObject.ValidFrom.AddTicks(-1); //现在工作
        }
    }
}

类节目
{
    静态无效的主要(字串[] args)
    {
        RuleValue RV1 =新RuleValue(DateTime.Parse(1900-01-01),DateTime.MaxValue);
        RuleValue RV2 =新RuleValue(DateTime.Parse(2010-03-22),DateTime.MaxValue);

        Console.WriteLine(第一);
        Console.WriteLine(老=+ rv1.ValidFrom + - + rv1.ValidTo);
        Console.WriteLine(新=+ rv2.ValidFrom + - + rv2.ValidTo);

        rv1.ChangeOldDate(RV1,RV2);

        Console.WriteLine(后);
        Console.WriteLine(老=+ rv1.ValidFrom + - + rv1.ValidTo);
        Console.WriteLine(新=+ rv2.ValidFrom + - + rv2.ValidTo);

        Console.ReadKey();
    }
}
//输出:
//第一:
//老= 1900-01-01 00:00:00  -  9999-12-31 23:59:59
//新建= 2010-03-22 00:00:00  -  9999-12-31 23:59:59
//后:
//老= 1900-01-01 00:00:00  -  2010-03-21 23:59:59
//新建= 2010-03-22 00:00:00  -  9999-12-31 23:59:59
//  全部正确! :D
 

解决方案

日期时间是一个不变的结构。:当你调用AddDays()或 AddTicks()返回一个DateTime 的的的新实例,它不会改变你调用它的实例。确保你的结果赋值给一个变量或出现在code无明显的变化:

 日期时间D1 = DateTime.Now;
D1 = d1.AddDays(-1); //分配回过头来看看新的实例
 

如果你需要重新设置日期到午夜的时间部分,你将需要使用一个明确的构造函数调用:

 日期时间D1 = DateTime.Now;
日期时间D2 =新日期时间(d1.Year,d1.Month,d1.Day,0,0,0);
日期时间D3 = d1.Date; //一个简单的替代方法,以上述...
 
网页性能监控实战 如何从多个角度分析监控结果

I want to set a DateTime property to previous day at 00:00:00. I don't know why DateTime.AddDays(-1) isn't working. Or why DateTime.AddTicks(-1) isn't working. First should this work?

I have 2 objects. Each object have DateTime fields ValidFrom, ValidTo.

EDIT: After coming home from work I tried to get the same behavior as my business objects behave. Below are the code I tried to replicate how it looks at work. Of course this is working at home but not at work. The good thing is I got good answers and +1 on all! =)

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 is an immutable struct. When you call AddDays() or AddTicks() it returns a new instance of a DateTime, it does NOT modify the instance you called it on. Make sure you assign the result to a variable or there is no visible change in your code:

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

If you need to reset the time portion of the date to midnight, you will need to use an explicit constructor call:

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