C#のDateTimeで最後の??:00時の変数を作りたいです。(??は可変)
13:00の変数を作る場合、
今が14日の12:00なら、2018/6/13 13:00
今が14日の14:00なら、2018/6/14 13:00
のようにしたいのですが、スマートなやり方がわかりません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
スマートかどうかはわかりませんが、シンプルに書きたいのであれば
拡張クラス作って
csharp
1public static class DateTimeExtension 2{ 3 public static DateTime PrevTime(this DateTime Now, TimeSpan TimeSpan) 4 { 5 return Now.Date - (Now.TimeOfDay > TimeSpan ? TimeSpan.Zero : TimeSpan.FromDays(1)) + TimeSpan; 6 } 7}
こんな感じに呼び出してみてはいかがでしょうか?
csharp
1var TargetTime = TimeSpan.Parse("13:00"); 2var resultTime1 = DateTime.Parse("2018/05/24 12:14").PrevTime(TargetTime); 3System.Diagnostics.Debug.WriteLine(resultTime1); 4var resultTime2 = DateTime.Parse("2018/05/24 13:54").PrevTime(TargetTime); 5System.Diagnostics.Debug.WriteLine(resultTime2);
plain
12018/05/23 13:00:00 22018/05/24 13:00:00
何度も呼ぶのであれば TimeSpan.FromDays(1)
は static readonly なTimeSpanにした方がいいかもしれませんが。
投稿2018/06/14 06:16
総合スコア128
0
ちょっとした頭の体操ですね。
C#
1int lastHour = 13; 2DateTime now = DateTime.Now; 3DateTime justHour = new DateTime((now.Ticks / TimeSpan.TicksPerHour) * TimeSpan.TicksPerHour); 4DateTime justHourLast = justHour - new TimeSpan(((justHour.Hour < lastHour) ? 24 : 0) + justHour.Hour - lastHour, 0, 0); 5 6// より短いのを追記しました。 7DateTime justHourLast2 = justHour - new TimeSpan((24 + justHour.Hour - lastHour) % 24, 0, 0);
投稿2018/06/14 06:16
編集2018/06/14 06:36総合スコア5938
0
C#
1int SetHour = 13; 2DateTime target, t; 3 4target = DateTime.Parse("2018/06/14 12:00:00"); 5t = target.Date.AddHours(SetHour).AddDays((target.Date.AddHours(SetHour) < target) ? 0 : -1); 6Console.WriteLine(t.ToString()); 7 8target = DateTime.Parse("2018/06/14 14:00:00"); 9t = target.Date.AddHours(SetHour).AddDays((target.Date.AddHours(SetHour) < target) ? 0 : -1); 10Console.WriteLine(t.ToString()); 11
こういう手もありかと
投稿2018/06/14 05:44
総合スコア10258
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
質問の内容を間違えて読み取ってしまったので修正します。
今日のN時か昨日のN時かを返せば良いと思います。
csharp
1 private void button1_Click(object sender, EventArgs e) 2 { 3 Test(2018, 6, 14, 12, 13); 4 Test(2018, 6, 14, 14, 13); 5 } 6 7 internal static void Test(int nYear, int nMonth, int nDay, int nHour, int nTargetHour) 8 { 9 var target = new DateTime(nYear, nMonth, nDay, nHour, 0, 0); 10 Debug.WriteLine($"{target} の直近の {nTargetHour:00}:00 は {GetPastLatestHour(target, nTargetHour)}"); 11 } 12 13 internal static DateTime GetPastLatestHour(DateTime target, int nHour) 14 { 15 var sameDay = new DateTime(target.Year, target.Month, target.Day, nHour, 0, 0); 16 17 if (sameDay <= target) 18 { 19 return sameDay; // 同じ日のnHour時 20 } 21 return sameDay - TimeSpan.FromDays(1); // 一日前のnHour時 22 }
出力:
text
12018/06/14 12:00:00 の直近の 13:00 は 2018/06/13 13:00:00 22018/06/14 14:00:00 の直近の 13:00 は 2018/06/14 13:00:00
投稿2018/06/14 04:38
編集2018/06/14 04:57総合スコア8356
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。