C# C中两个日期之间的差异#

C# C中两个日期之间的差异#,c#,C#,在senario中,我需要找出两个日期之间的差异。例如,开始日期为2012年1月1日,截止日期为2013年10月1日。我需要得到1.9年的输出 int tDays=(ToDate.Subtract(FromDAte).Days+1); int years = tDays / 365; int months = (tDays % 365) / 31; 但在闰年的情况下,这种计算是错误的。我的图书馆正是为这类事情而建立的: LocalDate start = new LocalDate(...);

在senario中,我需要找出两个日期之间的差异。例如,开始日期为2012年1月1日,截止日期为2013年10月1日。我需要得到1.9年的输出

int tDays=(ToDate.Subtract(FromDAte).Days+1);
int years = tDays / 365;
int months = (tDays % 365) / 31;
但在闰年的情况下,这种计算是错误的。

我的图书馆正是为这类事情而建立的:

LocalDate start = new LocalDate(...);
LocalDate end = new LocalDate(...);
Period period = Period.Between(start, end);
Console.WriteLine("{0} years, {1} months, {2} days",
                  period.Years, period.Months, period.Days);
请注意,这也将处理以下事实:月份并不总是相同的长度-例如,2013年2月1日至3月1日(28天)=1个月,而3月1日至3月1日 3月29日(也是28天)=0个月,28天

这会让你得到月、年、日——根据你的例子,我不确定你从哪里得到“1.9”,除非你使用的是“年、月”,我强烈建议你不要使用“年、月”,因为你的意思是“非常接近2年”。

我的库正是为这类事情而构建的:

LocalDate start = new LocalDate(...);
LocalDate end = new LocalDate(...);
Period period = Period.Between(start, end);
Console.WriteLine("{0} years, {1} months, {2} days",
                  period.Years, period.Months, period.Days);
请注意,这也将处理以下事实:月份并不总是相同的长度-例如,2013年2月1日至3月1日(28天)=1个月,而3月1日至3月1日 3月29日(也是28天)=0个月,28天


这将使您获得月、年和天-根据您的示例,我不确定您从何处获得“1.9”,除非您使用的是“年、月”,我强烈建议您不要使用“年、月”,因为它的意思似乎是“非常接近2年”。

您应该创建一个带有日期的DateTime对象。然后,您可以创建两个日期时间之间的差异,结果是一个TimeSpan对象。

您应该创建一个带有日期的DateTime对象。然后,您可以创建两个日期时间之间的差异,结果是一个TimeSpan对象。

如果您只需要一个值,您可以使用
Ticks
属性。例如:

//Calculate Ticks in one year
var now = DateTime.Now;
var ticksInYear = (now.AddYears(1) - now).Ticks;

//Create some dates
DateTime first = DateTime.Today.AddYears(-1);
DateTime second = Datetime.Today;

//Get the difference
long value = (second.Ticks - first.Ticks)/ticksInYear;

如果只需要一个值,则可以使用
Ticks
属性。例如:

//Calculate Ticks in one year
var now = DateTime.Now;
var ticksInYear = (now.AddYears(1) - now).Ticks;

//Create some dates
DateTime first = DateTime.Today.AddYears(-1);
DateTime second = Datetime.Today;

//Get the difference
long value = (second.Ticks - first.Ticks)/ticksInYear;
试试这个

        DateTime date_start = new DateTime(2011, 1, 30);
        DateTime date_end = new DateTime(2012, 2, 29);//leap year

        DateTime tmp_dtStart = date_start;
        DateTime tmp_dtEnd = date_end;

        //FIX FOR LEAP YEAR
        //If the day is the last day of the month just adding 1 day. This might solve the leap year problem.            
        if (tmp_dtStart.Day == DateTime.DaysInMonth(tmp_dtStart.Year, tmp_dtStart.Month))
        {
           tmp_dtStart= tmp_dtStart.AddDays(1);
        }
        if (tmp_dtEnd.Day == DateTime.DaysInMonth(tmp_dtEnd.Year, tmp_dtEnd.Month))
        {
           tmp_dtEnd= tmp_dtEnd.AddDays(1);
        }

        DateTime diff = new DateTime((tmp_dtEnd - tmp_dtStart).Ticks);

        int years = diff.Year - 1;
        int month = diff.Month - 1;

        string outStr = string.Format("{0}.{1} years", years, month);
我已经编辑了以前的代码来处理闰年

逻辑是,(我使用了2个临时日期变量,但没有触及实际日期变量) 检查当天是否等于当月的最后一天。如果是,那么 将1添加到天,然后移动到下个月

我已经测试了一些日期,它工作正常。

试试这个

        DateTime date_start = new DateTime(2011, 1, 30);
        DateTime date_end = new DateTime(2012, 2, 29);//leap year

        DateTime tmp_dtStart = date_start;
        DateTime tmp_dtEnd = date_end;

        //FIX FOR LEAP YEAR
        //If the day is the last day of the month just adding 1 day. This might solve the leap year problem.            
        if (tmp_dtStart.Day == DateTime.DaysInMonth(tmp_dtStart.Year, tmp_dtStart.Month))
        {
           tmp_dtStart= tmp_dtStart.AddDays(1);
        }
        if (tmp_dtEnd.Day == DateTime.DaysInMonth(tmp_dtEnd.Year, tmp_dtEnd.Month))
        {
           tmp_dtEnd= tmp_dtEnd.AddDays(1);
        }

        DateTime diff = new DateTime((tmp_dtEnd - tmp_dtStart).Ticks);

        int years = diff.Year - 1;
        int month = diff.Month - 1;

        string outStr = string.Format("{0}.{1} years", years, month);
我已经编辑了以前的代码来处理闰年

逻辑是,(我使用了2个临时日期变量,但没有触及实际日期变量) 检查当天是否等于当月的最后一天。如果是,那么 将1添加到天,然后移动到下个月



我已经测试了一些日期,它工作正常。

您忘记了
c#-5.0
标记。您的年份计数是整数。您不能通过
1.9
获得小数。您的意思是要将结果格式化为
{year}.{month}
?您忘记了
c#-5.0
标记。您的年份计数是一个整数。您不能通过
1.9
获取小数。您的意思是要将结果格式化为
{year}.{month}
?这与问题有什么关系?@Panagiotis Kanavos抱歉,误解了问题。更正。这与问题有什么关系?@Panagiotis Kanavos抱歉,误解了问题。更正。我没有使用NodaTime,你能解释一下这与只使用
TimeSpan diff=ToDate-FromDate
然后以任何形式打印TimeSpan有什么不同吗?NodaTime只是“好看”还是有功能上的差异?@Tobberoth:不,这是一个非常功能上的差异:
TimeSpan
只是一些滴答声。这意味着它不能将其分为“月”,因为它不知道我们谈论的是哪个月,等等。相同的
TimeSpan
可以表示1个月,或者1个月加3天,因为月份的长度不同。Noda Time中的
Period
类型是为这样的日历算法设计的,而不仅仅是一个日历中性的“这么多的节拍已经过去了”。(对于这个概念,我们有一个不同的类型-
持续时间
)。这正是我目前正在寻找的项目。很好。我没有使用NodaTime,你能解释一下这与只使用
TimeSpan diff=ToDate-FromDate
然后以任何形式打印TimeSpan有什么不同吗?NodaTime只是“好看”还是有功能上的差异?@Tobberoth:不,这是一个非常功能上的差异:
TimeSpan
只是一些滴答声。这意味着它不能将其分为“月”,因为它不知道我们谈论的是哪个月,等等。相同的
TimeSpan
可以表示1个月,或者1个月加3天,因为月份的长度不同。Noda Time中的
Period
类型是为这样的日历算法设计的,而不仅仅是一个日历中性的“这么多的节拍已经过去了”。(对于这个概念,我们有一个不同的类型-
持续时间
)。这正是我目前正在寻找的项目。干得不错。这没有考虑闰年或月份长度的变化。我对处理闰年做了一些更改。这没有考虑闰年或月份长度的变化。我对处理闰年做了一些更改。