我有一张表格,显示 1 年到 10 年的时间段。我想计算天数(一年大约 365 天,不需要包括闰年)。如果只是几年,则很容易计算天数(例如 2 年 = 2*365 天)。但是如何将 1.5 年或 1.75 年转换为天呢?
如果年份是用小数年指定的,那么计算天数的有效方法是什么。
谢谢纳特
我有一张表格,显示 1 年到 10 年的时间段。我想计算天数(一年大约 365 天,不需要包括闰年)。如果只是几年,则很容易计算天数(例如 2 年 = 2*365 天)。但是如何将 1.5 年或 1.75 年转换为天呢?
如果年份是用小数年指定的,那么计算天数的有效方法是什么。
谢谢纳特
尝试:
float year = 1.5;
int days = Math.Round(year * 365);
由于最初的问题是微不足道的,我将回答更有趣的问题,即考虑闰年和其他日期/时间异常。由于一年中的确切天数取决于所讨论的年份,因此唯一明智的方法是相对于给定日期计算它。第一步是AddYears
接受double
值的重载:
public static DateTime AddYears(this DateTime dateTime, double years)
{
int roundedYears = (int) Math.Floor(years);
var roundedDate = dateTime.AddYears(roundedYears);
var lastYearSpan = roundedDate.AddYears(1) - roundedDate;
return roundedDate.AddDays((years % 1) * lastYearSpan.TotalDays);
}
现在您可以获得对您有意义的天数,例如:
var now = DateTime.UtcNow;
Console.WriteLine((now.AddYears(1.25) - now).TotalDays);
样本测试:
public void TestAddYearsDouble()
{
var date = new DateTime(2000, 1, 15); //middle of the month to keep things simple
Assert.AreEqual(date.Year + 1, date.AddYears(1.0).Year);
Assert.AreEqual(date.Month, date.AddYears(1.0).Month);
Assert.AreEqual(date.Year, date.AddYears(0.0833).Year);
Assert.AreEqual(date.Month + 1, date.AddYears(0.0833).Month);
Assert.AreEqual(date.Year + 8, date.AddYears(8.5).Year);
Assert.AreEqual(date.Month + 6, date.AddYears(8.5).Month);
}