C# C中两个日期之间的差异#
在senario中,我需要找出两个日期之间的差异。例如,开始日期为2012年1月1日,截止日期为2013年10月1日。我需要得到1.9年的输出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(...);
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
类型是为这样的日历算法设计的,而不仅仅是一个日历中性的“这么多的节拍已经过去了”。(对于这个概念,我们有一个不同的类型-持续时间
)。这正是我目前正在寻找的项目。干得不错。这没有考虑闰年或月份长度的变化。我对处理闰年做了一些更改。这没有考虑闰年或月份长度的变化。我对处理闰年做了一些更改。