2016-10-23 168 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)。

使用第一個,盧克。每次調用時