游戏日期生成程序如何校验生成的日期为真实合法历史日期
实现方案
你完全不需要手动编写日期合法性校验逻辑,.NET 内置的 DateTime 结构已经天然处理了闰年2月天数、不同月份最大天数、年月自动进位的规则,直接基于初始日期按天累加即可,生成的所有日期都是合法的。
推荐实现(无需手动校验)
直接基于初始日期调用 AddDays 方法生成后续日期,代码如下:
// 先从ComboBox获取初始的年、月、日,生成起始日期对象 int initYear = int.Parse(cbo_year.SelectedItem.ToString()); int initMonth = int.Parse(cbo_month.SelectedItem.ToString()); int initDay = int.Parse(day); DateTime currentDate = new DateTime(initYear, initMonth, initDay); // 填充标签,lenght1为你需要生成的日期总数 for (int i = 1; i < lenght1; i++) { var labels = Controls.Find("lbl_date_" + i, true); var label = (Label)labels[0]; // 格式化为你需要的 dd.MM.yyyy 格式 label.Text = currentDate.ToString("dd.MM.yyyy"); // 直接加1天,自动处理月、年进位,生成的日期天然合法 currentDate = currentDate.AddDays(1); }
手动校验实现(匹配你原有逻辑)
如果你需要自己控制进位逻辑,可以用 DateTime.DaysInMonth 方法获取指定年月的最大合法天数,每次累加日之前做判断,代码如下:
int year = int.Parse(cbo_year.SelectedItem.ToString()); int month = int.Parse(cbo_month.SelectedItem.ToString()); int day1 = int.Parse(day); for (int i = 1; i < lenght1; i++) { var labels = Controls.Find("lbl_date_" + i, true); var label = (Label)labels[0]; label.Text = $"{day1}.{month}.{year}"; day1++; // 获取当前年月的最大合法天数 int maxDays = DateTime.DaysInMonth(year, month); if (day1 > maxDays) { day1 = 1; month++; if (month > 12) { month = 1; year++; } } }
内容的提问来源于stack exchange,提问作者Bubán Dávid
相关产品推荐
相关产品推荐

