我正在处理一段代码,我需要根据当前的一周命名文件夹(根据ISO8601标准)。
该文件夹将命名为:" y [year] w [year-year-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标准,我们可以忽略这样一个事实,那就是纽约证券交易所一年中没有发生任何变化,并假装它们在今年重合。)
如果DateTime.Now被评估两次,我可以想象一个场景,其中一个DateTimes仍然在2016年第52周,而另一个是在2017年第1周。这可能会带来麻烦,因为文件夹可能会被命名为& #34; 2017_52"或" 2016_1",这两个都是错误的 - 正确的将是" 2017_1"或" 2016_52"。
我确定我提供的第一段代码是可以的,但第二个代码段是否也适用于所有情况?
答案 0 :(得分:3)
DateTime.Now是否按实际时间评估一次或两次?
由于您两次调用DateTime.Now
,因此会对其进行两次评估。
我确定此代码在99.9999%的时间内有效,但如果发生这种情况会发生什么 代码是在午夜的新年晚上运行的?
完全。由于此表达式计算了两次,因此可能生成不同的结果(假设两个属性调用之间的时钟 Tick
。)
使用第一个,卢克。
答案 1 :(得分:2)
据我所知DateTime.Now
每次被调用时都会被评估。可能会有一些我不知道的优化,但为了安全起见,你应该把它作为一个事实。
你应该做些什么才能在0.0001%的时间内保持安全(可能更少,如果有的话)是将DateTime.Now
保留在一个变量中,我真的看不出你喜欢的大优势选项。
如果有可能,你可以确保它永远不会在午夜运行,这也可以解决你的问题..
答案 2 :(得分:1)
将当前DateTime保存在变量中是最好的选择。如果你两次调用DateTime.Now,你会得到不同的时间。
答案 3 :(得分: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
在这种情况下,它实际上并不是每毫秒拆分一个新值
缓存值并像在原始代码中一样使用它;它更安全,但也更容易阅读!