如何正确转换输入时间并使用.TotalDays?代码异常排查
C#日期计算异常问题分析与修复
问题描述
我需要实现以下功能:
- 计算用户输入的起始日期到当年年底的剩余天数
- 计算两个输入日期的总天数差值,用总差值减去起始日期到年底的天数
- 若结果大于360,输出该数值并持续减360,直到结果小于360
但当前代码输出异常:numberOfDays输出为0天,numberOfDays2输出为363,无法定位问题根源,之前使用.TotalDays的代码可正常运行,希望得到问题解释。
当前代码
internal class Program { static void Main(string[] args) { //Input and Visual Console.WriteLine("write here Beginning"); Console.Write("Day: "); string FirstDay = Console.ReadLine(); Console.Write("Month:"); string StillFirstDay = Console.ReadLine(); Console.Write("Year:"); string Still_FirstDay = Console.ReadLine(); Console.Clear(); Console.WriteLine("Beginn: " + FirstDay + "." + StillFirstDay + "." + Still_FirstDay); Console.WriteLine(""); Console.WriteLine("write here End "); Console.Write("Day: "); string LastDay = Console.ReadLine(); Console.Write("Monat:"); string StillLastDay = Console.ReadLine(); Console.Write("Jahr:"); string Still_LastDay = Console.ReadLine(); //Prepare int input = 0; int IFirstDay = 1; int IStillFirstDay = 1; int IStill_FirstDay = 1; int ILastDay = 1; int IStillLastDay = 1; int IStill_LastDay = 1; JustforConversion(FirstDay, input, IFirstDay); JustforConversion(StillFirstDay, input, IStillFirstDay); JustforConversion(Still_FirstDay, input, IStill_FirstDay); JustforConversion(LastDay, input, ILastDay); JustforConversion(StillLastDay, input, IStillLastDay); JustforConversion(Still_LastDay, input, IStill_LastDay); DateTime date1 = new DateTime(IStill_LastDay, IStillLastDay, ILastDay); DateTime date2 = new DateTime(IStill_FirstDay, IStillFirstDay, IFirstDay); var numberOfDays = (date2 - date1).TotalDays; Console.WriteLine(numberOfDays); int Year = IStill_FirstDay - IStill_LastDay; DateTime date3 = new DateTime(IStillFirstDay, 12, 30); var numberOfDays1 = (date3 - date2).Days; Console.WriteLine(numberOfDays1); var numberOfDays2 = numberOfDays - numberOfDays1; Console.WriteLine("In Year 1 there were " +numberOfDays1+" Days."); for (int i = 2; i <= Year; i++) { if (numberOfDays2 > 360) { Console.WriteLine("In Year " + i + " there were " + numberOfDays2 + " Days."); numberOfDays2 -= 360; } else { Console.WriteLine(numberOfDays2); break; } } Console.ReadKey(); } static void JustforConversion(string Converted,int Zero,int Complete_Convert) { while (int.TryParse(Converted, out Zero)) { Complete_Convert = Convert.ToInt32(Converted); break; } } }
问题根源
值传递导致变量未更新
JustforConversion方法的参数是值传递,方法内部修改Complete_Convert不会影响外部的变量值,所以所有日期相关的int变量(如IFirstDay、IStillFirstDay等)始终保持初始值1。这直接导致date1和date2都被初始化为DateTime(1,1,1),两者的差值自然为0。年份差值计算逻辑错误
代码中Year = IStill_FirstDay - IStill_LastDay是用起始年份减去结束年份,若结束年份大于起始年份,结果会是负数,循环for (int i = 2; i <= Year; i++)根本不会执行。正确的计算应该是结束年份减去起始年份。年底日期取值错误
代码中用12月30日作为当年年底,实际应该使用12月31日才能准确计算到年底的剩余天数。循环逻辑的逻辑漏洞
即使年份差值正确,当前循环仅处理到Year的次数,但未考虑剩余天数的循环处理逻辑,同时numberOfDays2的计算基于错误的总差值,导致输出异常。
修复后的代码
internal class Program { static void Main(string[] args) { // 输入起始日期 Console.WriteLine("请输入起始日期"); Console.Write("日: "); string firstDayStr = Console.ReadLine(); Console.Write("月: "); string firstMonthStr = Console.ReadLine(); Console.Write("年: "); string firstYearStr = Console.ReadLine(); Console.Clear(); Console.WriteLine($"起始日期: {firstDayStr}.{firstMonthStr}.{firstYearStr}"); Console.WriteLine(""); // 输入结束日期 Console.WriteLine("请输入结束日期"); Console.Write("日: "); string lastDayStr = Console.ReadLine(); Console.Write("月: "); string lastMonthStr = Console.ReadLine(); Console.Write("年: "); string lastYearStr = Console.ReadLine(); // 转换输入为整数(修复值传递问题,改用返回值) if (!int.TryParse(firstDayStr, out int firstDay) || !int.TryParse(firstMonthStr, out int firstMonth) || !int.TryParse(firstYearStr, out int firstYear) || !int.TryParse(lastDayStr, out int lastDay) || !int.TryParse(lastMonthStr, out int lastMonth) || !int.TryParse(lastYearStr, out int lastYear)) { Console.WriteLine("输入无效,请输入整数日期"); Console.ReadKey(); return; } // 构造日期对象 DateTime startDate = new DateTime(firstYear, firstMonth, firstDay); DateTime endDate = new DateTime(lastYear, lastMonth, lastDay); // 计算总天数差值 double totalDays = (endDate - startDate).TotalDays; Console.WriteLine($"总天数差值: {totalDays}"); // 计算起始日期到当年年底的天数 DateTime endOfStartYear = new DateTime(firstYear, 12, 31); int daysToEndOfStartYear = (endOfStartYear - startDate).Days; Console.WriteLine($"起始日期到当年年底剩余天数: {daysToEndOfStartYear}"); // 计算剩余需要分配的天数 double remainingDays = totalDays - daysToEndOfStartYear; Console.WriteLine($"第一年剩余天数: {daysToEndOfStartYear}"); // 处理后续年份的天数分配 int currentYear = firstYear + 1; while (remainingDays > 360) { Console.WriteLine($"第{currentYear - firstYear + 1}年天数: 360"); remainingDays -= 360; currentYear++; } if (remainingDays > 0) { Console.WriteLine($"第{currentYear - firstYear + 1}年天数: {remainingDays}"); } Console.ReadKey(); } }
修复说明
- 直接使用
int.TryParse转换输入并验证有效性,避免值传递导致的变量更新问题 - 修正年份差值的计算逻辑,改为从起始年份开始逐年处理剩余天数
- 使用
12月31日作为当年年底,确保剩余天数计算准确 - 改用
while循环处理剩余天数的分配,逻辑更清晰,能覆盖所有大于360的情况
内容的提问来源于stack exchange,提问作者Zane Assefa
相关产品推荐
相关产品推荐

