TimeSpan对象与月份和年份的时间间隔的绝对差异

时间:2014-09-16 07:07:06

标签: c#

我在C#中进行简单的时序操作时遇到了一些麻烦。

用户定义了两个DateTime个对象,作为时间间隔的开始和结束:

DateTime From = new DateTime(Y, Mo, D, H, Mi, S, Ms);
DateTime To = new DateTime(YY, MMo, DD, HH, MMi, SS, MMs);

然后考虑一个TimeSpan对象的延迟参数:

TimeSpan delay = new TimeSpan(day, month, hour, second);

现在程序应该返回时间间隔的偏差,对应于delay参数。

现在,有两个问题:

1-时间跨度没有YearMonth参数,而FromTo之间的差异可能超过Day ...我可以将YearMonth提供给TimeSpan对象吗?!...(我知道此目标没有已定义的构造函数)

2-最后的差异,我试图通过下面的代码片段捕获只会产生垃圾:

var diff = (To - From).duration() - delay;

我该如何解决这个案子?!

如果有人能处理上述情况,我感激不尽......

2 个答案:

答案 0 :(得分:4)

这是我的Noda Time项目旨在处理的事情。它有Period类型 知道几个月和几年,而不仅仅是固定数量的刻度。例如:

LocalDateTime start = new LocalDateTime(2014, 1, 1, 8, 30);
LocalDateTime end = new LocalDateTime(2014, 9, 16, 12, 0);
Period delay = new PeriodBuilder { 
        Months = 8, 
        Days = 10,
        Hours = 2,
        Minutes = 20
    }
    .Build();

Period difference = (Period.Between(start, end) - delay).Normalize();

此处difference为5天,1小时10分钟。 (Normalize()调用是将所有值标准化为最多天数...否则您可以拥有" 1小时--10分钟"例如。)Period API将会更改Noda Time 2.0的一点点,但它仍然会有相同的基本想法。)

答案 1 :(得分:1)

如果您选择向下舍入并添加扩展方法

public static class Extensions
{
    private const double DaysInYear = 365.242;
    private const double DaysInMonth = 30.4368;
    public static int GetDays(this TimeSpan ts)
    {
        return (int)((ts.TotalDays % DaysInYear % DaysInMonth));
    }
    public static int GetMonths(this TimeSpan ts)
    {
        return (int)((ts.TotalDays % DaysInYear) / DaysInMonth);
    }
    public static int GetYears(this TimeSpan ts)
    {
        return (int)(ts.TotalDays / DaysInYear);
    }
}

这很简单:

var oldDate = new DateTime(2002, 7, 15);
var newDate = new DateTime(2014, 9, 16, 12, 3, 0);
// Difference
var ts = newDate - oldDate;
var dm = ts.Minutes;        //3
var dh = ts.Hours;          //12
var dd = ts.GetDays();      //2
var dM = ts.GetMonths();    //2
var dY = ts.GetYears();     //12

请注意,这是一个近似值,只有在您可以做出假设时才会适用

  • DaysInYear = 365.242
  • DaysInMonth = 30.4368

是对的。