質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

5回答

5235閲覧

C# DateTimeで過去直近??:00時の変数を作りたい

hellokato

総合スコア13

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/06/14 04:17

C#のDateTimeで最後の??:00時の変数を作りたいです。(??は可変)

13:00の変数を作る場合、
今が14日の12:00なら、2018/6/13 13:00
今が14日の14:00なら、2018/6/14 13:00
のようにしたいのですが、スマートなやり方がわかりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2018/06/14 04:37

スマートじゃないやり方が分かっているのでしょうから、それを提示し、これよりスマート(何を持ってスマートとすべきかもありますが)なやり方を聞くべきかと思います。
guest

回答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

juner

総合スコア128

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hellokato

2018/06/14 06:52

教えて頂き、ありがとうございます!! スマートです!!TimeOfDayの存在を初めて知りました!感謝感激です!
guest

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
catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hellokato

2018/06/14 06:56

教えて頂き、ありがとうございます!! 非常に短コードです!やってる事の計算を読み解くのに苦労しました^^;
guest

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

YAmaGNZ

総合スコア10258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

現在時刻が午前0時台だった場合でも、正しく前日23:00を取得できる方法です。

C#

1DateTime t = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, 0, 0) - TimeSpan.FromHours(1);

ご参考になれば。

投稿2018/06/14 04:52

tkanda

総合スコア2425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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
takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hellokato

2018/06/14 06:47

教えて頂き、ありがとうございます!! 処理量と読み解きやすさのバランスが最も私の好みでした!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問