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