2016-10-23 14 views
0

私は現在、現在の週(ISO8601標準に準拠)に基づいてフォルダ名を指定する必要があるコードを作成中です。日時。関数呼び出しにおける今の評価

フォルダの名前は "y [year] w [week-of-year]"になります。例えば、フォルダ名は今週 "y2016w42"になる可能性があります。

私は現在、次の操作を行います。私は、最初のフォルダ名を生成するためにそれを使用する前に、変数nに現在の時刻を割り当てる

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

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

がDateTime.Nowは一度か二度、実際の時間に評価されます。

今、私はむしろちょうど次の操作を行い、実際のでしょうか?コンパイラは最初の評価から再利用しますか、実際にはこのシナリオでは2つの異なるタイムスタンプを取得しますか?

このコードは99.9999%の時間で動作すると確信していますが、このコードを真夜中の新年夕方に実行するとどうなりますか? (今年の週がISO8601標準に従ってNYEで必然的に変更されず、今年も同じであると思われるという事実を無視することができます)。

DateTime.Nowが2回評価された場合、DateTimesの1つがまだ52週目の2016年にあり、もう1つが2017年の1週間目であるというシナリオを想像することができます。 "2017_52"または "2016_1"のいずれかが間違っています - 正しいものは "2017_1"または "2016_52"です。

私が提供したコードの最初のスニペットは大丈夫ですが、2番目のスニペットもすべてのシナリオで機能しますか?

+0

なぜ2番目のバージョンが好きですか? (最初のバージョンはより読みやすく分かりやすいので) – Dexter

+0

'string folderName =" y%sw%s "%(n.Year、DataHelper.WeekOfYearISO8601(n))'は私の好みの方法です:文字列の連結が遅いですPythonでは文字列が不変であるためです。書式文字列を書き込む方が高速です。 – TemporalWolf

+0

@dexter: "DateTime.Now"は "n"と同じようにundestandableなので、余分な変数は不要だと思います。 – MNM

答えて

1

DateTime.Nowは(それがどのように正確にここで良い議論があります:How does DateTime.Now.Ticks exactly work?)は約10msはの解像度に、それが呼び出されるたびに再評価され

あなたはここに(非常に簡単にライブバージョンを、これを見ることができます: 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

ええ、コンソールに書いてもちょっと時間がかかります。 –

1

現在の日付時刻を変数に保存することが最良の方法です。 DateTime.Nowを2回呼び出すと、異なる時刻が表示されます。

2

私が知る限り、DateTime.Nowは呼び出されるたびに評価されます。私が気付いていないいくつかの最適化があるかもしれませんが、安全のためだけにそれを事実として取るべきです。

DateTime.Nowを変数に保存することは、時間の0.0001%(恐らくはそれほど多くありません)に安全を置くために何をすべきか、私は本当にあなたの好みのオプションに大きな利点は見当たりません。

ことが可能であるならば、あなたはそれが真夜中に実行されることはありませんことを確認することができ、そしてそれはまた、あなたの問題を解決するだろうが...

3

は、DateTime.Nowは一度か二度、実際の時間に評価されていますか?

DateTime.Nowを2回呼び出したので、2回評価されます。

このコードは99.9999%の時間で動作しますが、この コードが真夜中に新年の夕方に実行されるとどうなりますか?

正確に。この式は2回評価されているので、(おそらく)は異なる結果を生成します(クロックTickの2つのプロパティ呼び出しの間で行われます)。

最初のもの、Lukeを使用してください。

関連する問題