【发布时间】:2017-12-14 01:42:14
【问题描述】:
我有一个函数可以在两个日期之间的范围内生成随机日期时间......并且它以某种方式使随机日期出现在最小日期之前。我的代码有什么问题?
public void TestFunct()
{
GenerateRandomTimeBetweenDates(new Random(), DateTime.ParseExact("01.01.2017 00:00:00", "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture), DateTime.ParseExact("01.02.2017 00:00:00", "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture));
}
public DateTime GenerateRandomTimeBetweenDates(Random RNG, DateTime dt1, DateTime dt2)
{
int dt1_sec = (int)dt1.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds; //calc seconds since Unix epoch
int dt2_sec = (int)dt2.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
int random_sec = RNG.Next(Math.Min(dt1_sec, dt2_sec), Math.Max(dt1_sec, dt2_sec)); //RNG is Random instance. Here I generate seconds amount between two amounts - minimal and maximal.
DateTime random_dt = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(random_sec); //I try to recreate date by adding generated seconds amount to Unix epoch.
if (random_dt.Year == 2016)
random_dt = random_dt; //this I use to trigger breakpoint
return random_dt;
}
【问题讨论】:
-
1) 不要忘记检查` if (dt1 > dt2)` ? 2)
DateTime random_dt = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(random_sec).AddSeconds(dt1_sec); -
你的
BuyersManager.RNG.Next会发生什么? -
@krillgar - 抱歉,忘记指出这只是普通的 Random 实例。
-
你得到的随机值是否在你期望的范围内?
-
什么是
dt1和dt2,这是本地时间还是UTC 时间?我想这是当地时间。当您致电ToUniversalTime时,您将获得 2016 年的 UTC 日期。从你的例子 1483214400 是 2016-12-31T20:00:00+00:00。