C# 日期确认酒店预订

C# 日期确认酒店预订,c#,winforms,timespan,C#,Winforms,Timespan,您好,我正在创建一个酒店预订表,并希望按入住的夜晚计算总住宿成本。它需要到达日期和离开日期,但我想添加一个验证,因此,如果用户输入的格式不正确,将显示一个消息框,要求他们重试。这是我的代码,在转换时间跨度方面已经有了一些帮助,所以再次说明,任何帮助都将是惊人的。错误出现在以“dateDiff=aDate”开头的行上,它表示变量aDate和dDate未分配,这要感谢您提前: String arrival, departure; arrival = textBox1.

您好,我正在创建一个酒店预订表,并希望按入住的夜晚计算总住宿成本。它需要到达日期和离开日期,但我想添加一个验证,因此,如果用户输入的格式不正确,将显示一个消息框,要求他们重试。这是我的代码,在转换时间跨度方面已经有了一些帮助,所以再次说明,任何帮助都将是惊人的。错误出现在以“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));

你的代码将在你捕获后继续。使用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");
        }
如果它们解析成功,则不要返回,否则在输入验证时将没有结果


或者,将返回放置在catch块中,以便在失败时停止执行。

将一些默认值分配给
aDate
dDate
,错误就会消失。原因是编译器无法确定是否会在try块中为它们赋值。你能行

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

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

因此,您的完整代码应该是:

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));
你的代码应该是

    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;
    }

编译器发出警告的原因是您尚未为本地
DateTime
字段赋值。局部变量不是用默认值初始化的,因此在使用它们之前必须手动初始化。由于您在
Try/Catch
中分配了值,因此无法确保他们会得到一个值

相反,您可以使用:


使用dateTimePicker控件您不需要解析

感谢您回来我之前阅读了这篇文章,但使用了try and catch,因为这是我比较熟悉的东西(这是一个非常新的东西),但我确实希望尽可能提高我的编码效率,所以我会尝试将其集成到future@user1823383,用于数据解析,我建议您总是更喜欢使用具有各自数据类型的TryParse方法,验证的异常处理可能非常昂贵,如果可以的话应该避免。+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;
    }
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");
}