Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的随机日期时间生成器使日期超出范围?_C#_.net_Datetime_Utc - Fatal编程技术网

C# 为什么我的随机日期时间生成器使日期超出范围?

C# 为什么我的随机日期时间生成器使日期超出范围?,c#,.net,datetime,utc,C#,.net,Datetime,Utc,我有一个函数来生成两个日期之间的随机日期时间。。。不知何故,它会在最小日期之前随机产生日期。我的代码怎么了 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.

我有一个函数来生成两个日期之间的随机日期时间。。。不知何故,它会在最小日期之前随机产生日期。我的代码怎么了

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;
}

这里的问题是
ToUniversalTime()
。如果您的日期具有某种类型的
本地
未指定
-
ToUniversalTime
将把它们转换为UTC,假设(在
未指定
的情况下)它们是本地的。这样,您的
dt1
(2017年1月1日)将以UTC表示为2016年的日期。当随机值接近最小值时,结果也将在2016年出现。要解决此问题,只需删除对
ToUniversalTime()
的调用。您可以删除它,因为通过
Substract
方法的文档:

System.DateTime.Subtract(System.DateTime)方法不可用 考虑两个系统的值。 执行减法时的System.DateTime值

但是请注意,最好返回与输入类型相同的结果,因此:

DateTime random_dt = new DateTime(1970, 1, 1, 0, 0, 0, dt1.Kind).AddSeconds(random_sec); 

否则,如果您的输入代表本地时间,并且结果是UTC,则没有多大意义。

1)不要忘记检查“如果(dt1>dt2)”?2)
DateTime random\u dt=新的日期时间(1970,1,1,0,0,DateTimeKind.Utc).AddSeconds(random\u sec).AddSeconds(dt1\u sec)
在您的
BuyersManager.RNG.Next
中发生了什么?@krillgar-抱歉,忘了指出这只是正常的随机实例。您得到的随机值是否在您期望的范围内?什么是
dt1
dt2
,这是本地时间还是utc时间?我想这是当地时间。当您调用
ToUniversalTime
时,您会得到2016年的utc日期。从你的例子中,1483214400是2016-12-31T20:00:00+00:00。谢谢。我照你说的做了,不再有外人了。