2016-10-23 119 views
0

我目前正在研究一段代码,我需要根据当年的一周(根据ISO8601标准)命名一个文件夹。Datetime.Now评估函数调用

该文件夹将被命名为:“y [year] w [week-of-year]”。因此,例如本周文件夹名称可能是“y2016w42”。

我现在做到以下几点:

DateTime n = DateTime.Now; 
string folderName = "y" + n.Year + "w" + DataHelper.WeekOfYearISO8601(n); 

我第一次当前的时间分配给一个变量n,用它来生成文件夹名称之前。

现在,我真的宁愿只是做到以下几点:

string folderName = "y" + DateTime.Now.Year + "w" + DataHelper.WeekOfYearISO8601(DateTime.Now); 

是DateTime.Now评估,以实际时间一次或两次?编译器是否从第一次评估中重新使用它,或者在这种情况下实际得到两个不同的时间戳?

我确定此代码的工作时间为99.9999%,但如果此代码在新年晚上在午夜运行会发生什么情况? (根据ISO8601标准,我们可以忽略这样一个事实,即每年的一周并没有在NYE上发生必然的变化,并且假设它们今年一致)。

如果对DateTime.Now进行了两次评估,我可以想象一种情况,其中一个DateTime仍在第52周2016年,而另一个在第1周2017年。这可能会造成麻烦,因为该文件夹可能会被命名“2017_52”或“2016_1”,两者都是错误的 - 正确的是“2017_1”或“2016_52”。

我敢肯定,我提供的代码的第一部分是没关系,但第二个代码段也适用于所有情况?

+0

你为什么喜欢第二个版本? (imho第一个版本更具可读性,因此更容易理解) – Dexter

+0

'string folderName =“y%sw%s”%(n.Year,DataHelper.WeekOfYearISO8601(n))''是我的首选方式:string concatenation is slow ,因为字符串在Python中是不可变的。填充格式字符串更快。 – TemporalWolf

+0

@dexter:我认为“DateTime.Now”与“n”一样难以忍受,因此额外的变量看起来没有必要,特别是因为我发现自己经常用DateTime来做这件事。 – MNM

回答

1

DateTime.Now将重新评估,以约10毫秒的分辨率(这里有一个很好的讨论,这是多么准确:How does DateTime.Now.Ticks exactly work?

你可以在这里看到这个很容易(现场版: http://rextester.com/XJVEJ16515):

Console.WriteLine(DateTime.Now.Ticks); 

var currVal = DateTime.Now.Ticks; 
for (int i = 0; i < 10000; i++) { 
    if (currVal != DateTime.Now.Ticks) { 
     Console.WriteLine(currVal); 
     currVal = DateTime.Now.Ticks; 
    } 
} 

输出:

> 636128255483021039 
> 636128255483177570 
> 636128255483333827 
> 636128255483489977 
> 636128255483646493 
> 636128255483802799 
> 636128255483959218 
> 636128255484115758 
> 636128255484271805 
> 636128255484428165 

在这种情况下,实际上没有分裂每millisecon一个新值d

缓存该值并像在原始代码中一样使用它;它更安全,但也更容易阅读!

+0

是的,即使写到控制台_should_也需要一点时间。 –

1

将当前日期时间保存在变量中是最佳选择。如果你打电话给DateTime.Now两次,你会得到不同的时间。

2

据我所知,每次调用DateTime.Now时都会被评估。可能有一些我不知道的优化,但你应该把它作为一个事实来保证安全。

你应该怎么做才能保证在那些0.0001%的时间内安全(如果有的话可能少得多)要将DateTime.Now保存在一个变量中,我真的没有看到你的首选方案有很大的优势。

如果可能的话,你可以确保它永远不会运行在午夜,而这也将解决你的问题..

3

是DateTime.Now评估,以实际时间一次或两次?

既然你两次调用DateTime.Now,它会被评估两次。

我敢肯定,这个代码工作的时间99.9999%,但如果这 代码是在午夜在新年晚会上运行会发生什么?

没错。由于这个表达式评估了两次,他们可能产生不同的结果(假设两个属性调用之间的时钟确实是Tick)。

使用第一个,卢克。每次调用时