〖原理其实非常简单,取出两个时间差的秒数,...... 原理其实非常简单,取出两个时间差的秒数,再在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 { /**//// /// 获取随机时间 /// /// 由于Random 以当前系统时间做为种值,所以当快速运行多次该方法所得到的结果可能相同, /// 这时,你应该在外部初始化 Random 实例并调用 GetRandomTime(DateTime time1, DateTime time2, Random random) /// /// /// /// /// public static DateTime GetRandomTime(DateTime time1, DateTime time2) { Random random = new Random(); return GetRandomTime(time1, time2, random); } /**//// /// 获取随机时间 /// /// /// /// /// 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 { /**//// /// 边界测试 /// [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); } } } |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )
GMT+8, 2024-9-29 23:22 , Processed in 0.207734 second(s), 12 queries , Gzip On, MemCache On.
Powered by Discuz! X3.5
© 2001-2023 Discuz! Team.