【问题标题】:How to get both Random Date and Time C#如何同时获取随机日期和时间 C#
【发布时间】:2016-03-06 02:25:52
【问题描述】:

我正在尝试编写一个代码来生成随机日期和时间,其中 (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));
        }

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

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) 生成随机值?

【问题讨论】:

  • 只需在 DateTime 的合法范围内添加随机的秒数
  • 你没有在单元测试中使用这些,对吧..?
  • 所有构造函数参数只使用随机数
  • 谢谢大家,但我不明白,你能复制代码部分并告诉我在哪里可以进行更改吗?因为我花了很长时间试图找到解决方案,从 3 天到现在
  • stuartd,不,我想把代码放在一个循环中,我想在演示数据库中插入最少 10000 条记录,并且我希望交易日期时间随机

标签: c# date datetime random time


【解决方案1】:

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

它使用适当的限制,因此生成的日期是有效的(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);

【讨论】:

  • 这给了我奇怪的值“WebApplication1.AddToParkingDb+d__0”
  • protected void Button1_Click(object sender, EventArgs e) { var randomDateTimes = GenerateRandomDates(10000); Response.Write(randomDateTimes);}
  • 这是惊人的结果,感谢stackoverflow让我们认识像你这样的天才:)
  • 我只是改变了 var year = rnd.Next(2013, 2015);所以我可以限制岁月
【解决方案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))));
}

【讨论】:

    猜你喜欢
    • 2021-07-30
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2015-08-21
    • 1970-01-01
    相关资源
    最近更新 更多