原理其实非常简单,取出两个时间差的秒数,再在0到该秒数之间随机获取一个整数,将其做为秒添加到较小的时间上,可以说实现上并没什么技术难点,可以在数据类型的边界条件上却需要格外的注意,比如将大于 System.Int32.MaxValue 或小于 System.Int32.MinValue 的值转成 int 时,如果直接在变量前加上类型名转换((int)d),不会有有异常产生,但得到的值却是 System.Int32.MinValue,还有就是对于Math.Abs 方法,当参数 value 等于 MinValue 将会引发 System.OverflowException 异常。
代码如下:
usingSystem;
namespaceYyw
{
publicclassDateTimeHelper
{
/**////<summary>
///获取随机时间
///<remarks>
///由于Random以当前系统时间做为种值,所以当快速运行多次该方法所得到的结果可能相同,
///这时,你应该在外部初始化Random实例并调用GetRandomTime(DateTimetime1,DateTimetime2,Randomrandom)
///</remarks>
///</summary>
///<paramname="time1"></param>
///<paramname="time2"></param>
///<returns></returns>
publicstaticDateTimeGetRandomTime(DateTimetime1,DateTimetime2)
{
Randomrandom=newRandom();
returnGetRandomTime(time1,time2,random);
}
/**////<summary>
///获取随机时间
///</summary>
///<paramname="time1"></param>
///<paramname="time2"></param>
///<paramname="random"></param>
///<returns></returns>
publicstaticDateTimeGetRandomTime(DateTimetime1,DateTimetime2,Randomrandom)
{
DateTimeminTime=newDateTime();
DateTimemaxTime=newDateTime();
System.TimeSpants=newSystem.TimeSpan(time1.Ticks-time2.Ticks);
//获取两个时间相隔的秒数
doubledTotalSecontds=ts.TotalSeconds;
intiTotalSecontds=0;
if(dTotalSecontds>System.Int32.MaxValue)
{
iTotalSecontds=System.Int32.MaxValue;
}
elseif(dTotalSecontds<System.Int32.MinValue)
{
iTotalSecontds=System.Int32.MinValue;
}
else
{
iTotalSecontds=(int)dTotalSecontds;
}
if(iTotalSecontds>0)
{
minTime=time2;
maxTime=time1;
}
elseif(iTotalSecontds<0)
{
minTime=time1;
maxTime=time2;
}
else
{
returntime1;
}
intmaxValue=iTotalSecontds;
if(iTotalSecontds<=System.Int32.MinValue)
maxValue=System.Int32.MinValue+1;
inti=random.Next(System.Math.Abs(maxValue));
returnminTime.AddSeconds(i);
}
}
}
测试代码:
usingSystem;
usingNUnit.Framework;
namespaceYyw
{
[TestFixture]
publicclassDateTimeHelperFixture
{
/**////<summary>
///边界测试
///</summary>
[Test]
publicvoidTestGetRandomTime()
{
DateTimeminTime=DateTime.MinValue;
DateTimemaxTime=DateTime.MaxValue;
Randomrandom=newRandom();
for(inti=0;i<10000;i++)
{
DateTimerandomTime=DateTimeHelper.GetRandomTime(maxTime,minTime,random);
CheckResult(minTime,maxTime,randomTime);
}
for(inti=0;i<10000;i++)
{
DateTimerandomTime=DateTimeHelper.GetRandomTime(minTime,maxTime,random);
CheckResult(minTime,maxTime,randomTime);
}
}
privatevoidCheckResult(DateTimeminTime,DateTimemaxTime,DateTimerandomTime)
{
System.TimeSpants1=newSystem.TimeSpan(randomTime.Ticks-minTime.Ticks);
System.TimeSpants2=newSystem.TimeSpan(randomTime.Ticks-maxTime.Ticks);
Assert.IsTrue(ts1.Seconds>=0&&ts2.Seconds<=0);
}
}
}