我在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-时间跨度没有Year
和Month
参数,而From
和To
之间的差异可能超过Day
...我可以将Year
和Month
提供给TimeSpan
对象吗?!...(我知道此目标没有已定义的构造函数)
2-最后的差异,我试图通过下面的代码片段捕获只会产生垃圾:
var diff = (To - From).duration() - delay;
我该如何解决这个案子?!
如果有人能处理上述情况,我感激不尽......
答案 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
请注意,这是一个近似值,只有在您可以做出假设时才会适用
是对的。