DateTime.Now如何工作?

Bea*_*ear 0 javascript c# datetime

我发现一些代码看起来像这样:

var obj = new SomeClass();
obj.FirstProperty = Magic.GetFirstProperty();
//...
obj.CreateDate = DateTime.Now;
obj.ModificationDate = obj.CreateDate;
Run Code Online (Sandbox Code Playgroud)

有很多属性,所以我决定重构该代码并使用对象初始化器.

var obj = new SomeClass
{
    FirstProperty = Magic.GetFirstProperty();
    //...
    CreateDate = DateTime.UtcNow,
    ModificationDate = DateTime.UtcNow
};
Run Code Online (Sandbox Code Playgroud)

在对象初始化块中将属性从一个重写到另一个是不可能的(据我所知)并且在块外看起来很糟糕(在我看来).

我决定进行测试,并且我从600到1200个不同的对中进行了10 000 000次迭代.这是代码:

class Program
{
    static void Main(string[] args)
    {
        int j = 0;
        for (int i = 0; i < 10000000; i++)
        {
            var obj = new SomeClass
            {
                First = DateTime.UtcNow,
                Second = DateTime.UtcNow
            };

            if (obj.First != obj.Second)
                Console.WriteLine(j++ + "  :  " + GetDateInfo(obj.First) + "  " + GetDateInfo(obj.Second));
        }
        Console.WriteLine("End of work");
        Console.ReadKey();
    }

    static string GetDateInfo(DateTime dateTime) =>
        $"{dateTime.Hour} : {dateTime.Minute} : {dateTime.Second} : {dateTime.Millisecond} -  {dateTime.Ticks}";
}

internal class SomeClass
{
    public DateTime First { get; set; }
    public DateTime Second { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在这里我们有一些结果:

屏幕截图结果

正如你所看到的,一些记录,如高光照,只有处理器滴答.

与此同时,除了谷歌浏览器中的内存泄漏外,javascript总是返回相同的值.这是代码:

var d,d2,n,n2;
for(var i=0; i<1000000; i++) {
    d = new Date();
    n = d.getTime();
    d2 = new Date();
    n2 = d.getTime();

    if(n===n2) 
        console.log("equal"); 
    else 
        console.log("not equal");  
}
Run Code Online (Sandbox Code Playgroud)

您是否知道如何以适当的方式在.NET中解决该问题以及DateTime.Now如何实际工作?我非常好奇幕后发生的事情.我期待一次迭代/对象初始化中的两个值都是相等的.

mus*_*fan 5

您是否知道如何以适当的方式在.NET中解决该问题...

解决方案很简单,只需调用DateTime.UtcNow一次......

var dtNow = DateTime.UtcNow;
var obj = new SomeClass
{
    FirstProperty = Magic.GetFirstProperty();
    //...
    CreateDate = dtNow,
    ModificationDate = dtNow
};
Run Code Online (Sandbox Code Playgroud)

在循环的情况下,如果您希望所有值完全相同,则应dtNow 循环开始之前分配.即只分配一次.


... DateTime.Now实际上是如何工作的?

简而言之,它会在您调用的点获取当前值DateTime.UtcNow.

不久之后,如果您真的感兴趣,请查看文档并进行进一步研究.

  • @TimSchmelter:我同意,这是一个奇迹......为什么一个循环随着时间的推移会导致不同的时间似乎很明显 (2认同)