原理其實非常簡單,取出兩個時間差的秒數,再在0到該秒數之間隨機獲取一個整數,將其做為秒添加到較小的時間上,可以說實現上并沒什么技術難點,可以在數據類型的邊界條件上卻需要格外的注意,比如將大于 system.int32.maxvalue 或小于 system.int32.minvalue 的值轉成 int 時,如果直接在變量前加上類型名轉換((int)d),不會有有異常產生,但得到的值卻是 system.int32.minvalue,還有就是對于math.abs 方法,當參數 value 等于 minvalue 將會引發 system.overflowexception 異常。
代碼如下:
using system;
namespace yyw
{
public class datetimehelper
{
/**//// <summary>
/// 獲取隨機時間
/// <remarks>
/// 由于random 以當前系統時間做為種值,所以當快速運行多次該方法所得到的結果可能相同,
/// 這時,你應該在外部初始化 random 實例并調用 getrandomtime(datetime time1, datetime time2, random random)
/// </remarks>
/// </summary>
/// <param name="time1"></param>
/// <param name="time2"></param>
/// <returns></returns>
public static datetime getrandomtime(datetime time1, datetime time2)
{
random random = new random();
return getrandomtime(time1, time2, random);
}
/**//// <summary>
/// 獲取隨機時間
/// </summary>
/// <param name="time1"></param>
/// <param name="time2"></param>
/// <param name="random"></param>
/// <returns></returns>
public static datetime getrandomtime(datetime time1, datetime time2, random random)
{
datetime mintime = new datetime();
datetime maxtime = new datetime();
system.timespan ts = new system.timespan(time1.ticks - time2.ticks);
// 獲取兩個時間相隔的秒數
double dtotalsecontds = ts.totalseconds;
int itotalsecontds = 0;
if (dtotalsecontds > system.int32.maxvalue)
{
itotalsecontds = system.int32.maxvalue;
}
else if (dtotalsecontds < system.int32.minvalue)
{
itotalsecontds = system.int32.minvalue;
}
else
{
itotalsecontds = (int)dtotalsecontds;
}
if (itotalsecontds > 0)
{
mintime = time2;
maxtime = time1;
}
else if (itotalsecontds < 0)
{
mintime = time1;
maxtime = time2;
}
else
{
return time1;
}
int maxvalue = itotalsecontds;
if (itotalsecontds <= system.int32.minvalue)
maxvalue = system.int32.minvalue + 1;
int i = random.next(system.math.abs(maxvalue));
return mintime.addseconds(i);
}
}
}
測試代碼:
using system;
using nunit.framework;
namespace yyw
{
[testfixture]
public class datetimehelperfixture
{
/**//// <summary>
/// 邊界測試
/// </summary>
[test]
public void testgetrandomtime()
{
datetime mintime = datetime.minvalue;
datetime maxtime = datetime.maxvalue;
random random = new random();
for (int i = 0; i < 10000; i++)
{
datetime randomtime = datetimehelper.getrandomtime(maxtime, mintime, random);
checkresult(mintime, maxtime, randomtime);
}
for (int i = 0; i < 10000; i++)
{
datetime randomtime = datetimehelper.getrandomtime(mintime, maxtime, random);
checkresult(mintime, maxtime, randomtime);
}
}
private void checkresult(datetime mintime, datetime maxtime, datetime randomtime)
{
system.timespan ts1 = new system.timespan(randomtime.ticks - mintime.ticks);
system.timespan ts2 = new system.timespan(randomtime.ticks - maxtime.ticks);
assert.istrue(ts1.seconds >= 0 && ts2.seconds <= 0);
}
}
}
新聞熱點
疑難解答