我正在寻找一个好的算法,最好是使用CLR的DateTime
类型和其他内置的东西,而不仅仅是使用金属数学,来猜测生日日期给定年龄。
日期应该是现实的,而不仅仅是1月1日。我需要它们来测试一个应用程序,其中包含生日数字的数字用Luhn校验位进行验证。
到目前为止,我从现在开始减去年龄,给我一个最短的约会时间。然后我可以随机添加几年,几个月和几天。然而,后一个过程在获得错误的随机月份或日期方面是粗略的,可能会改变日期的最终年龄。
答案 0 :(得分:2)
一种快速而肮脏的解决方案,使用min
查找max
和Ticks
之间的日期:
var min = DateTime.Parse("1988/02/10");
var max = DateTime.Parse("2016/01/05");
var minTicks = min.Ticks;
var maxTicks = max.Ticks;
var baseTicks = maxTicks-minTicks;
var rnd = new Random();
var toAdd = (long)(rnd.NextDouble()*baseTicks);
var newDate = new DateTime(minTicks+toAdd);
当然,如果您需要多个日期,可以将它们添加到列表中:
public static List<DateTime> GetBirthdaysBetweenDates(DateTime minDate, DateTime maxDate, int number = 1)
{
if(minDate > maxDate) throw new ArgumentException("minDate can't be greater then maxDate");
var dates = new List<DateTime>();
if(number <= 0) return dates;
var rnd = new Random();
var ticks = maxDate.Ticks - minDate.Ticks;
for(var i = 0; i < number; i++)
{
var toAdd = (long)(rnd.NextDouble() * ticks);
dates.Add(new DateTime(minDate.Ticks + toAdd));
}
return dates;
}
答案 1 :(得分:1)
你可以尝试这样的事情:
//define lowest and highest days here
DateTime dateFrom = new DateTime(2017, 1, 1);
DateTime dateTo = new DateTime(2018, 1, 1);
//calculate number of days
int daysRange = dateTo.Subtract(dateFrom).Days;
//list to hold generated birthdays
List<DateTime> birthdays = new List<DateTime>();
//randomizer
Random rand = new Random();
//number of birthdays to generate
int number = 10;
for (int i = 0; i<number; i++)
{
//genrate number between 0 and daysRange and add that many days to dateFrom
DateTime newDate = dateFrom.AddDays(rand.Next(daysRange));
//add to list
birthdays.Add(newDate);
}