如何获得随机日期和时间C#

时间:2015-12-02 00:12:11

标签: c# date datetime random time

我正在尝试编写生成随机日期和时间的代码,其中(yyyy-mm-dd hh:mm:ss)的所有值都已更改

我使用了此代码,但它只更改了日期并修复了时间

 DateTime RandomDay()
        {
            DateTime start = new DateTime(2013, 1, 1 , 1 , 1 ,1);
            Random gen = new Random();

            int range = (DateTime.Today - start).Days;
            return start.AddDays(gen.Next(range));
        }

我说好的,如果我编写一个生成随机日期的代码,并将其存储在variable1中,然后编写另一个生成随机时间的代码,并将其存储在variable2中,然后仅从variable1中选择日期,然后选择时间只来自variable2,然后将variable1和variable2组合在一起,这样我就可以生成随机的日期和时间 因此,我写了另一种方法来生成时间

DateTime RandomTime()
        {
            DateTime start = new DateTime(2013, 1, 1, 1, 1, 1);
            Random gen = new Random();

            int range = (DateTime.Today - start).Hours;
            return start.AddHours(gen.Next(range));
        }

现在是RandomTime方法中的问题,它只生成随机小时,不会改变分钟和秒的值,

有什么建议可以解决代码问题吗?反正为所有人生成随机值(yyyy-mm-dd hh:mm:ss)?

2 个答案:

答案 0 :(得分:6)

这是一种随机生成日期和时间的每个部分的方法。

它使用适当的限制,因此生成的日期有效(1-9999之间的年份,1-12之内的月份, DateTime.DaysInMonth 的调用所以我们不会结束2月31日等等。

public IEnumerable<DateTime> GenerateRandomDates(int numberOfDates)
{
    var rnd = new Random(Guid.NewGuid().GetHashCode());

    for (int i = 0; i < numberOfDates; i++)
    {
        var year = rnd.Next(1, 10000);
        var month = rnd.Next(1, 13);
        var days = rnd.Next(1, DateTime.DaysInMonth(year, month) + 1);

        yield return new DateTime(year, month, days,
            rnd.Next(0, 24), rnd.Next(0, 60), rnd.Next(0, 60), rnd.Next(0, 1000));
    }
}

生成10,000个:

var randomDateTimes = GenerateRandomDates(10000);

答案 1 :(得分:2)

这是一线解决方案。返回部分为1行;)

private static Random _ran = new Random();

public static DateTime RandomDateTime()
{
    return
        DateTime.MinValue.Add(
            TimeSpan.FromTicks((long) (_ran.NextDouble()*DateTime.MaxValue.Ticks)));
}

注1:_ran.NextDouble()给出0到1之间的随机值。因此,您添加到最小日期时间的滴答数量将介于0DateTime.MaxValue.Ticks之间。因此,随机日期时间将介于最小和最大日期时间之间。

注2:DateTime.Min.Ticks等于0.因此即使添加最大日期时间标记,此过程也不会溢出。

以下是如何生成10k随机日期时间。

DateTime[] datetimes = new DateTime[10000];

for (int i = 0; i < datetimes.Length; i++)
{
    datetimes[i] = RandomDateTime();
}

如果要定义范围,也可以使用此方法。

public static DateTime RandomDateTime(DateTime min, DateTime max)
{
    return
        DateTime.MinValue.Add(
            TimeSpan.FromTicks(min.Ticks + (long) (_ran.NextDouble()*(max.Ticks - min.Ticks))));
}