在两个日期之间获取随机DateTime的最佳做法是什么?

Pur*_*ome 17 .net c# random datetime

我正在尝试将值随机化为一个简单的DateTime数据字段.

我希望获得两个日期/时间之间的随机日期/时间(例如,最小日期/时间和最大日期/时间).

所以让我们想象一下我之间的随机日期/时间

1/1/2000 10:00:00am1/1/2000 5:00:00pm.

此外,此代码将用于for循环,包含100个项目...意味着所有100个项目将具有最小/最大日期/时间段之间的随机日期/时间.

有任何想法吗?

Chr*_*isF 37

您可以尝试使用:

TimeSpan timeSpan = endDate - startDate;
var randomTest = new Random();
TimeSpan newSpan = new TimeSpan(0, randomTest.Next(0, (int)timeSpan.TotalMinutes), 0);
DateTime newDate = startDate + newSpan;
Run Code Online (Sandbox Code Playgroud)

这将为您提供不同的时间.如果你想要100(或任何超过1的东西)DateTimes,那么只需创建Random一次对象.在MSDN页面上Random详细解释了为什么创建几个Random对象临门是一个坏主意.

使用不同的TimeSpan构造函数将为您提供不同的粒度.从TimeSpan构造函数MSDN:

TimeSpan(Int64)将新TimeSpan初始化为指定的刻度数.
TimeSpan(Int32,Int32,Int32)将新TimeSpan初始化为指定的小时数,分钟数和秒数.
TimeSpan(Int32,Int32,Int32,Int32)将新TimeSpan初始化为指定的天数,小时数,分钟数和秒数.
TimeSpan(Int32,Int32,Int32,Int32,Int32)将新TimeSpan初始化为指定的天数,小时数,分钟数,秒数和毫秒数.


p.c*_*ell 5

这是我的算法和代码:

  • 找出两个日期之间的差异
  • 对于每次迭代,在两个日期之间创建一个随机数
  • 在他们之间创建一个新的日期。只需将该随机数作为分钟添加到开始日期时间。  

    Random randNum = new Random();
    
    DateTime minDt = new DateTime(2000,1,1,10,0,0);
    DateTime maxDt = new DateTime(2000,1,1,17,0,0);
    List<DateTime> myDates = new List<DateTime>();
    //Random.Next in .NET is non-inclusive to the upper bound (@NickLarsen)
    int minutesDiff = Convert.ToInt32(maxDt.Subtract(minDt).TotalMinutes+1);
    
    for (int i = 0; i < 100; i++)
    {
       // some random number that's no larger than minutesDiff, no smaller than 1
       int r=   randNum.Next(1, minutesDiff); 
       myDates.Add(minDt.AddMinutes(r));
    }
    
    foreach (DateTime d in myDates)
    {
      Console.WriteLine(string.Format("{0:dd-MMM-yyyy hh:mm}",d));
    }
    
    Run Code Online (Sandbox Code Playgroud)