C#使用UTC时获取正确的滴答声

时间:2019-01-14 14:59:05

标签: c#

在此处使用C#

我有以下设置,我想在其中更新createdOn日期并保存到我的数据库中。

 foreach (var person in myData)
 {
   person.CreatedBy = "abc";
   person.CreatedOn = DateTime.UtcNow.ToString("o"); 
 }

 myRepo.Save(myData);

问题是,如果我有5行数据,则所有5行都获得相同的createdOn

例如,以上所有内容都相同

CreatedOn as "2019-01-14T14:48:39.4814925Z" 

我在这里想念的是什么,我想每次循环并添加createdOn都会得到下一个刻度。

3 个答案:

答案 0 :(得分:2)

  

此属性的分辨率取决于系统计时器,该计时器取决于基础操作系统。它通常在0.5到15毫秒之间。结果,在较短的时间间隔(例如在循环中)重复调用Now属性可能会返回相同的值。

https://docs.microsoft.com/en-us/dotnet/api/system.datetime.now?redirectedfrom=MSDN&view=netframework-4.7.2#System_DateTime_Now

答案 1 :(得分:1)

如果您担心每个Person对象的值都不同,则可以在循环之前获取日期时间,并将100 nanoseconds添加到每个值,因为1 nanosecond等于1/1000000000 (billionth)每秒钟,在每次迭代中添加100个这样的对象,同时给出唯一的时间,对于每个人对象,其精度仍然保持非常接近:

//Set a variable to hold the current utc time before the loop starts
DateTime currentUtcTime = DateTime.UtcNow;
foreach (var person in myData)
{
   person.CreatedBy = "abc";
   person.CreatedOn = currentUtcTime.ToString("o");
   //Add 100 nanoseconds to the currentUtcTime variable
   currentUtcTime = currentUtcTime.AddTicks(1); 
}

 myRepo.Save(myData);

DateTime.AddTickshttps://docs.microsoft.com/en-us/dotnet/api/system.datetime.addticks?view=netframework-4.7.2)的文档

答案 2 :(得分:1)

DateTime doesn't have this precision(tl; dr:“高精度计时根本不是DateTime的目的;正如您所注意到的,这就是{{1 }}“ )。但是您可以在循环之前启动StopWatch并将其StopWatch的值添加到初始Elapsed的值中:

DateTime.UtcNow