-1

嗨,我正在创建一个酒店预订表格,并想按所住的夜数计算总住宿费用。它需要到达日期和出发日期,但我想添加验证,因此如果用户输入的格式不正确,则会显示一个消息框,要求他们重试。这是我的代码在转换时间跨度方面已经有了一些帮助,所以再一次任何帮助都会令人惊叹。错误出现在以“dateDiff = aDate”开头的行上,它表示变量 aDate 和 dDate 未分配,提前致谢:

        String arrival, departure;
        arrival = textBox1.Text;
        departure = textBox2.Text;

        DateTime aDate, dDate;

        try
        {
            aDate = DateTime.ParseExact(arrival, "dd/mm/yyyy", null);
            dDate = DateTime.ParseExact(departure, "dd/mm/yyyy", null);
            return;
        }
        catch
        {
            MessageBox.Show("Invalid input format please enter in format DD/MM/YYYY");
        }

        TimeSpan dateDiff;
        dateDiff = dDate.Subtract(aDate);
        int nights = (int)dateDiff.TotalDays;

        textBox3.Text = ("" + nights);
        textBox5.Text = ("£" + (nights * 115));
4

5 回答 5

2

编译器警告的原因是您没有为本地DateTime字段分配值。局部变量未使用默认值初始化,因此您必须手动执行此操作才能使用它们。由于您在 a 中分配了值,Try/Catch因此不能保证他们会得到一个。

相反,您可以使用DateTime.TryParseExact

DateTime aDate, dDate;
if( DateTime.TryParseExact(arrival, "dd/mm/yyyy", null, DateTimeStyles.None, out aDate)
 && DateTime.TryParseExact(departure, "dd/mm/yyyy", null, DateTimeStyles.None, out dDate))
{
    // ...
}
else{
    MessageBox.Show("Invalid input format please enter in format DD/MM/YYYY");
}
于 2012-11-16T11:14:24.827 回答
1

您的代码在您捕获后继续。使用 try 块中的日期放置代码。

        String arrival, departure;
        arrival = textBox1.Text;
        departure = textBox2.Text;

        DateTime aDate, dDate;

        try
        {
            aDate = DateTime.ParseExact(arrival, "dd/mm/yyyy", null);
            dDate = DateTime.ParseExact(departure, "dd/mm/yyyy", null);

            TimeSpan dateDiff;
            dateDiff = dDate.Subtract(aDate);
            int nights = (int)dateDiff.TotalDays;

            textBox3.Text = ("" + nights);
            textBox5.Text = ("£" + (nights * 115));
        }
        catch
        {
            MessageBox.Show("Invalid input format please enter in format DD/MM/YYYY");
        }

如果它们解析成功,请不要返回,否则当您的输入验证时您将没有结果。

或者,将 return 放在您的 catch 块中,以便在失败时停止执行。

于 2012-11-16T11:09:27.613 回答
1

你的代码应该是

    String arrival, departure;
    arrival = textBox1.Text;
    departure = textBox2.Text;

    DateTime aDate, dDate;

    try
    {
        aDate = DateTime.ParseExact(arrival, "dd/mm/yyyy", null);
        dDate = DateTime.ParseExact(departure, "dd/mm/yyyy", null);

        TimeSpan dateDiff;
        dateDiff = dDate.Subtract(aDate);
        int nights = (int)dateDiff.TotalDays;

        textBox3.Text = ("" + nights);
        textBox5.Text = ("£" + (nights * 115));

    }
    catch
    {
        MessageBox.Show("Invalid input format please enter in format DD/MM/YYYY");
        return;
    }
于 2012-11-16T11:12:29.333 回答
0

aDate为您的,分配一些默认值dDate,错误就会消失。原因是编译器无法确定它们是否会在 try 块中确定地被赋值。你可以做

DateTime aDate = default(DateTime);
DateTime dDate = default(DateTime);

与其使用 try-catch 来验证日期,不如使用DateTime.TryParseExact

DateTime aDate, dDate;


if (DateTime.TryParseExact(arrival, 
                           "dd/MM/yyyy", 
                            CultureInfo.InvariantCulture,
                            DateTimeStyles.NoCurrentDateDefault, 
                            out aDate))
{
    MessageBox.Show("Invalid input format please enter in format DD/MM/YYYY");
}

所以你的完整代码应该是:

String arrival, departure;
arrival = textBox1.Text;
departure = textBox2.Text;

DateTime aDate, dDate;


if (DateTime.TryParseExact(arrival, 
                            "dd/MM/yyyy", 
                            CultureInfo.InvariantCulture, 
                            DateTimeStyles.NoCurrentDateDefault, 
                            out aDate))
{
    MessageBox.Show("Invalid input format for Arrival Date - please enter in format DD/MM/YYYY");
}
if (DateTime.TryParseExact(departure, 
                            "dd/MM/yyyy", 
                            CultureInfo.InvariantCulture, 
                            DateTimeStyles.NoCurrentDateDefault, 
                            out dDate))
{
    MessageBox.Show("Invalid input format for Departure Date - please enter in format DD/MM/YYYY");
}


TimeSpan dateDiff;
dateDiff = dDate.Subtract(aDate);
int nights = (int)dateDiff.TotalDays;

textBox3.Text = ("" + nights);
textBox5.Text = ("£" + (nights * 115));
于 2012-11-16T11:10:06.423 回答
0

使用不需要解析的 dateTimePicker 控件

于 2012-11-16T11:18:04.567 回答