You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确转换输入时间并使用.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;
        }
    }
}

问题根源

  1. 值传递导致变量未更新
    JustforConversion方法的参数是值传递,方法内部修改Complete_Convert不会影响外部的变量值,所以所有日期相关的int变量(如IFirstDay、IStillFirstDay等)始终保持初始值1。这直接导致date1和date2都被初始化为DateTime(1,1,1),两者的差值自然为0。

  2. 年份差值计算逻辑错误
    代码中Year = IStill_FirstDay - IStill_LastDay是用起始年份减去结束年份,若结束年份大于起始年份,结果会是负数,循环for (int i = 2; i <= Year; i++)根本不会执行。正确的计算应该是结束年份减去起始年份。

  3. 年底日期取值错误
    代码中用12月30日作为当年年底,实际应该使用12月31日才能准确计算到年底的剩余天数。

  4. 循环逻辑的逻辑漏洞
    即使年份差值正确,当前循环仅处理到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 17:55:18