2009-07-17 6 views
16

これは非常に簡単だと確信していますが、私は突然精神的なブロックを持っています。
私は次の3amのDateTimeオブジェクトを取得しようとしています。 DateTime.Now16/july/2009 : 12:04pmある場合たとえば、 - 午前3時の次のoccuranceは17/july/2009 : 03:00次の午前3時のDateTime発生

だろうDateTime.Now17/july/2009 : 01:00た場合は、次の出現はまだ(後のない日)17/july/2009 : 03:00だろう。
これは意味がありますか?

答えて

28

一つのオプション:

DateTime now = DateTime.Now; 
DateTime today3am = now.Date.AddHours(3); 
DateTime next3am = now <= today3am ? today3am : today3am.AddDays(1); 

別:その特定の猫をスキニングの方法の

DateTime now = DateTime.Now; 
DateTime today = now.Date; 
DateTime next3am = today.AddHours(3).AddDays(now.Hour >= 3 ? 1 : 0) 

たくさん:)

これは意味し、全てのコースの現地時間ですタイムゾーンについて心配する必要はありません。人生は...それは良いアイデアだと

注意はあなたが計算している間に日付がロールオーバーした場合の問題を回避するために一度DateTime.Nowを取るために...あなたはタイムゾーンが関与取得したい場合はトリッキーになり

+7

'日時today3am = DateTime.Today.AddHours(3);' – Blixt

+0

Definetely私がインライン場合、およびラムダ式を行うには、この方法を憎みます...読者には親切ではありません。しかし、これはうまく動作します。 –

+1

「今」を一度服用して再使用するのは良い点です。私はその昨日の答えで間違いを犯しました。そして、エリック・リッペルトはそれを私に呼びました! – LukeH

5
DateTime now = DateTime.Now; 
DateTime threeAM = now.Date.AddHours(3); 

if (threeAM < now) 
    threeAM = threeAM.AddDays(1); 
(機能を使用して)
1

代替:

DateTime NextAt(TimeSpan time) 
{ 
    DateTime now = DateTime.Now; 
    DateTime result = now.Date + time; 

    return (now <= result) ? result : result.AddDays(1); 
} 

コールはそれが好き:

DateTime next3am = NextAt(new TimeSpan(3,0,0)); 
あなたはif文(または条件演算子)なしでそれを行うことができます
1

// get the current time 
DateTime now = DateTime.Now; 
// get a 3:00 AM point in time in the future 
DateTime next = now.Date.AddHours(24 + 3); 
// subtract the number of whole extra days 
next = next.AddDays((now - next).Days); 

それはだとして、私はいつも、このような計算で一度だけの時間(DateTime.Now)であなたがポイントを得る必要があることを説明私はそれを繰り返さなければならないのですか?さて、私はやった。 ;)

2
//just add 24 - 3 = 21 hours and get Today (start of day) and Add 3 hour 

DateTime now = DateTime.Now.AddHours(21).Today.AddHours(3); 
+0

+1:いい考えですが、正確には午前3時であれば失敗します(翌日に返すかどうかは議論の余地があります) –

0

私はこの1つだと思う:

DateTime.Now.Date.AddHours(3).AddMinutes(0).AddSeconds(0).AddDays(1); 
関連する問題