如何准确计算日,月,年?
平均值..
从1990年1月2日到2009年5月9日是..
xxx天,xxx个月,xxx年。
知道怎么做吗?
我尝试过Timespan和Tick()..两者都没有这样做..
答案 0 :(得分:6)
我不认为框架中有任何内容可以做到这一点。 TimeSpan
不会这样做,因为天数等取决于确切的起点和终点,而不仅仅是它们之间的持续时间。
这是一种简单的方式,但效率低下:
using System;
class Program
{
static void Main()
{
ShowDifference(new DateTime(1990, 1, 2),
new DateTime(2009, 5, 9));
}
static void ShowDifference(DateTime start,
DateTime end)
{
if (start > end)
{
throw new ArgumentException();
}
// See comment at the end
int years = end.Year - start.Year - 2;
while (start.AddYears(years) <= end)
{
years++;
}
years--;
Console.WriteLine("{0} years", years);
start = start.AddYears(years);
int months = 0;
while (start.AddMonths(months) <= end)
{
months++;
}
months--;
Console.WriteLine("{0} months", months);
start = start.AddMonths(months);
int days = 0;
while (start.AddDays(days) <= end)
{
days++;
}
days--;
Console.WriteLine("{0} days", days);
}
}
显然,有一些方法可以提高效率,但它们会很繁琐。编辑:我已经改变了这一点,开始对这些年份进行非常保守的猜测 - 它可能比它需要的低一个,但我现在不想考虑角落情况。它应该肯定有效,并且循环都有(相当小的)上限,它们将运行的次数。
请注意,在每个步骤中,您应该将完整的年数/天/月添加到起点,而不是一次一个月。否则,如果您从1月30日到3月30日,它将要求2个月和 2天,因为从1月30日到2月28日,当您添加一个月,然后是2月28日到3月28日时你加了第二个月。
希望Noda Time在我最终完成它时会使这一切变得更容易:)
答案 1 :(得分:3)
你不能通过直接计算来做到这一点(即TimeSpan
没有“TotalMonths”或“TotalYears”属性,只是因为这些数字在任意时间间隔内没有意义。)
相反,您可以在循环中计算数字,如下所示:
var dt1 = new DateTime(1990, 1, 2);
var dt2 = new DateTime(2009, 5, 9);
int years = 0;
while (dt1.AddYears(1) < dt2)
{
years ++;
dt1 = dt1.AddYears(1);
}
int months = 0;
while (dt1.AddMonths(1) < dt2)
{
months ++;
dt1 = dt1.AddMonths(1);
}
int days = (int) Math.Floor(dt2.Subtract(dt1).TotalDays);
我没有对此进行测试,因此可能存在一个错误或其他错误,但这是基本想法。
答案 2 :(得分:0)
这样的事情怎么样?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DateTimeTest
{
class Program
{
static void Main(string[] args)
{
var dt1 = new DateTime(1990, 1, 2);
var dt2 = new DateTime(2009, 5, 9);
int days = dt2.Day - dt1.Day;
int months = dt2.Month - dt1.Month;
int years = dt2.Year - dt1.Year;
if (months < 0)
{
months += 12;
years -= 1;
}
if (days < 0)
{
dt1.AddYears(years);
dt1.AddMonths(months);
days = dt2.Subtract(dt1).Days;
months -= 1;
}
Console.WriteLine("{0} Days, {1} Months, {2} Years", days, months, years);
}
}
}
输出
7 Days, 4 Months, 19 Years
这是你要找的输出吗?根据您想要定义“月份”的方式,您可能需要一些额外的条件。