【问题标题】:Validating DateTime Input from Console in C#在 C# 中验证来自控制台的 DateTime 输入
【发布时间】:2014-07-30 05:05:36
【问题描述】:

为了以亲身实践的方式学习 C#,我开始完成我在网上找到的这些作业...

http://www1.cs.columbia.edu/~lok/csharp/assignments.html

我被困在练习 1,问题 3 中。如何从控制台请求日期,然后根据给定的标准进行检查?在这种情况下,请检查日期是否在今天之后,如果为真则提供“无效”消息。

我的代码目前如下所示。我觉得逻辑在那里,但与范围有关的事情不会让它编译 - userBirthdate 在循环之外似乎无法访问。

我相信还有一个更简单的解决方案。

非常感谢任何帮助 - 谢谢大家!

        //Set today's date as a variable            
        DateTime todayDate = DateTime.Today;
        DateTime userBirthdate;

        //Ask user for birth date
        Console.Write("Please enter your date of birth (dd/mm/yy):  ");

        //Validate the input and set as a variable
        bool inputValid = false;
        while (inputValid != true)
        {
            if (DateTime.Parse(Console.ReadLine()) > todayDate)
            {
                Console.Write("Invalid Date.  Please enter your date of birth (dd/mm/yy):  ");
            }
            else
            {
                userBirthdate = DateTime.Parse(Console.ReadLine());
                Console.WriteLine(userBirthdate);
                inputValid = true;
            }
        }

        //Calculate user age
        int userAge = todayDate.Year - userBirthdate.Year;
        if (userBirthdate > todayDate.AddYears(-userAge)) userAge--;

        //Output
        Console.WriteLine("You are {0} years old!", userAge);
        Console.ReadLine();

【问题讨论】:

  • 啊哈哈,将第一个答案标记为解决方案,但你们都解决了多个问题。非常感谢!

标签: c# validation loops datetime input


【解决方案1】:

由于您没有初始化变量userBirthdate,因此当您稍后尝试使用它时,编译器会给您一个警告。首先将其设置为一个值或更改您的逻辑:

DateTime userBirthdate = DateTime.Today;

【讨论】:

    【解决方案2】:

    几件事(也初始化userBirthDate,正如其他帖子中指出的那样:

    1. 使用DateTime.TryParse(Console.ReadLine(), out userBirthdate) 查看它是否是有效的日期时间。如果您立即执行此操作,您甚至可能不需要初始化 userBirthdate
    2. 检查是否为 > DateTime.Now 以确保它不在未来。
    3. 请使用Subtract 方法来查看过去是否太久。它为您提供了一个 TimeSpan 对象,您可以使用它来确保它不像 135 年左右那样老。

    【讨论】:

      【解决方案3】:

      除了其他答案之外,您还调用了 Console.ReadLine() 两次:一次是在您阅读时检查并验证输入是否大于今天的日期,另一次是在将其分配给 userBirthdate 时。您应该先分配它然后进行验证,否则您的程序将挂起,因为它正在等待用户的更多输入。

      while (inputValid != true)
      { 
          userBirthdate = DateTime.Parse(Console.ReadLine());
      
          if (userBirthdate > todayDate)
          {
              Console.Write("Invalid Date.  Please enter your date of birth (dd/mm/yy):  ");
          }
          else
          {
              Console.WriteLine(userBirthdate);
              inputValid = true;
          }
      }
      

      【讨论】:

        【解决方案4】:

        你需要在循环外初始化userBirthdate

            DateTime userBirthdate = DateTime.MinValue;
        

        该值无关紧要,因为您将在 while 循环中为其分配一个值,但编译器无法确定这一点,除非进行比设计更多的静态分析。

        还有其他几个问题,但这应该可以解决编译问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-23
          • 2012-05-15
          • 1970-01-01
          • 1970-01-01
          • 2014-09-07
          • 1970-01-01
          相关资源
          最近更新 更多